Как показали большинство других ответов, обычно это делает mod_rewrite. Но если вы не хотите использовать mod_rewrite, вы можете позволить вашему файлу начальной загрузки фактически настраивать переменные из самого URL.
Я использую несколько своих собственных функций, которые создают массив из URL, поэтому:
site.com/page/welcome/param1/param2
становится
$url[0] = 'page'
$url[1] = 'welcome'
$url[2] = 'param1'
$url[3] = 'param2'
и затем я могу передать массив $ url моему маршрутизатору, и он решает, к каким частям вызова Controller / Action / Param относится каждый элемент.
Тот же URL-запрос, показанный выше, создает вызов Controller / Action / Param:
// http request for site.com/page/welcome/param1/param2
$controller = new Page_Controller('param1', 'param2');
$controller->welcomeAction();
в то время как, в зависимости от настроек в моем объекте Router, я могу создавать подкаталоги, например, для вызовов 'admin /':
// http request for site.com/admin/page/welcome/param1/param2
$controller = new Admin_Page_Controller('param1', 'param2');
$controller->welcomeAction();
С помощью url_rewrite я думаю, что было бы сложнее (хотя все еще возможно) добавить эти перенаправления, и с моим методом (некоторые фреймворки могут также делать это, не слишком уверенно), это позволяет вам настраивать его больше, т.е. массив $ url, если необходимо, перед передачей его в объект Router.
Я не уверен, что минусы в использовании этого метода, но он работает очень хорошо для меня!