Я использую Apache
как веб-сервер по умолчанию в своих проектах и обычно использую правила mod_rewrite
с файлом .htaccess
, чтобы перемещаться по виртуальным URL-адресам, например: http://example.com/en/page/parameters...
в файл index.php
и все работает отлично.
Но я пытаюсь улучшить совместимость своих проектов, чтобы работать с каждым веб-сервером, таким как Nginx
, Litespeed
, lighttpd
, IIS
и так далее. но, очевидно, файл .htaccess
не поддерживается всеми из них. Я ищу стандартный метод или постоянное решение для обработки не основанных ошибок, запустив php файл, чтобы mod_write
то образом имитировать mod_write
.
если такой стандартный метод не существует, то лучший способ заместителя для обработки правил перезаписи, например, за пределами кодов для большинства распространенных веб-серверов, таких как приведенные выше примеры:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Options -Indexes
Эта задача потребует от вас соблюдения определенных принципов проектирования.
Прежде всего, вам нужно будет иметь какой-то Front-Controller, который обрабатывает все входящие запросы (чтобы префикс URI вам все равно нужно было настроить какой-то URL-Rewriting, который снова зависит от веб-сервера).
Затем вам понадобится какой-то слой маршрутизации, который отправляет URI для определенного действия. Все, что не должно быть отправлено вашим маршрутизатором, должно бросить 404.
Это об этом. Вот очень простой пример, в котором излагаются детали, которые необходимо выполнить. Но будьте осторожны: в реальных приложениях как Front-Controller, так и Router являются одними из наиболее важных частей приложения, поэтому не заново изобретайте колесо.
<?php
$routes = [
'home' => 'home.php',
'about-us' => 'aboutus.php'
];
if( ! array_key_exists( $_GET['page'], $routes ) )
{
// The 'page' get parameter has no value that matches with the
// router so respond with a 404
header('HTTP/1.0 404 Not Found');
echo "I'm a 404 and I'm handled via PHP";
}
else
{
echo $routes[ $_GET['page'] ];
}
(URL Rewriting не включен, поскольку он не является частью вопроса)