Blend them.
Never, ever, split your variables up to look like a directory structure. Things like Google rank your pages lower the more it looks like they are nested in deep directories.
Generally, when you're doing something like this, it's generally nice to do a blend of the two methods. There is nothing wrong with having some get variables. Also, you could add in a url mapping that auto-assigns get variables on the back-end. That way you can have things like, say, "/page-1-1.html" translate to ?chapter=1&page=1 to your scripts. However, if you want to do something like sort by X as well, keep that as a GET param, there's no need to mask things like that as it's nothing more than needless and extra headaches.
Generally in something like a CMS (which is what I'm familiar with), you'd have some sort of URL mapping that translates particular special urls or patterns into the explicit variables you need. Say, for instance, you are using a CMS and therefore need to define a controller and view for viewing a comic page vs a news article. The comic page could be something like, say, the "viewIndex" method on the "ControllerComic" controller, where the news article page could be the "viewIndex" method on the "ControllerNews" controller:
class ControllerComic {
public function viewIndex() {
}
}
class ControllerNews {
public function viewIndex() {
}
}
Yet to define this to your system you pass something like, say a "view" variable
Now, what you could do is make something like "/comic-1-1.html" translate to "?view=comic.index&chapter=1&page=1" to your primary script, then loading/appending things to get the appropriate controllers and views:
if (preg_match(';/comic-([0-9]+)-([0-9]+)[.]html;', $_SERVER['REQUEST_URI'], $match)) {
$_GET['controller'] = 'comic';
$_GET['view'] = 'index';
$_GET['chapter'] = $match[1];
$_GET['page'] = $match[2];
}
Of course this is a VERY rough example, and I'd generally advise against explicitly setting GET/POST vars in this fashion. Instead it would be better to explicitly define a global custom environment variable for your application and read that in conjunction to the passed GET/POST vars.