Стандартный метод обработки не найденных (404) ошибок во всех видах веб-серверов

0

Я использую 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
Теги:
nginx
.htaccess
mod-rewrite

1 ответ

1

Эта задача потребует от вас соблюдения определенных принципов проектирования.

Прежде всего, вам нужно будет иметь какой-то 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 не включен, поскольку он не является частью вопроса)

  • 0
    Спасибо за ваши советы. Я использую свою собственную платформу, основанную на архитектуре MVC, которая имеет центральный Front-Controller для анализа URI. но он работает с реальным URI ($ _SERVER ['REQUEST_URI']), а не с $ _GET. но проблема работает на всех веб-серверах kine.
  • 0
    Да, фактический метод парсинга URL-адреса запроса вообще не важен :) просто хотел указать вам правильное направление

Ещё вопросы

Сообщество Overcoder
Наверх
Меню