PHP-фронт-контроллер без необходимости жесткого кодирования baseroot

Кажется, что простой фронт-контроллер , работающий также, когда приложение находится в подкаталоге (например, 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 | 

Это надежный? Нет ли угловых случаев?


Заметки:

  1. Это не работает:

      $request1 = $_SERVER['REQUEST_URI']; 

    потому что если контроллер example.com/website/index.php и мы вызываем example.com/website/calendar тогда $request1 будет /website/calendar вместо calendar

  2. Это не работает:

     $request2 = basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); 

    потому что, если контроллер example.com/website/index.php и мы вызываем example.com/website/edit/article17 тогда $request2 будет стать $request2 вместо edit/article17

Related of "PHP-фронт-контроллер без необходимости жесткого кодирования baseroot"