Кажется, что простой фронт-контроллер , работающий также, когда приложение находится в подкаталоге (например, example.com/website/
), с Apache + PHP может быть .htaccess
следующим образом:
RewriteEngine On RewriteRule .* index.php [L]
и этот код PHP:
$siteroot = substr($_SERVER['PHP_SELF'], 0, - strlen(basename($_SERVER['PHP_SELF']))); $request3 = substr(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), strlen($siteroot));
Действительно, вот результаты, которые я тестировал:
| Requested URL | Controller file | $request3 | |-----------------------------------------------------------------------------------------| | example.com | example.com/index.php | '' | | example.com/ | example.com/index.php | '' | | example.com/hello | example.com/index.php | hello | | example.com/hello?id=10 | example.com/index.php | hello | | example.com/edit/article17 | example.com/index.php | edit/article17 | | example.com/edit/article17?a=b | example.com/index.php | edit/article17 | | example.com/website | example.com/website/index.php | '' | | example.com/website/ | example.com/website/index.php | '' | | example.com/website/hello | example.com/website/index.php | hello | | example.com/website/hello?id=10 | example.com/website/index.php | hello | | example.com/website/edit/article17 | example.com/website/index.php | edit/article17 | | example.com/website/edit/article17?a=b | example.com/website/index.php | edit/article17 |
Это надежный? Нет ли угловых случаев?
Заметки:
Это не работает:
$request1 = $_SERVER['REQUEST_URI'];
потому что если контроллер example.com/website/index.php
и мы вызываем example.com/website/calendar
тогда $request1
будет /website/calendar
вместо calendar
Это не работает:
$request2 = basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
потому что, если контроллер example.com/website/index.php
и мы вызываем example.com/website/edit/article17
тогда $request2
будет стать $request2
вместо edit/article17