ErrorDocument 404 против FallbackResource против RewriteRule - PullRequest
0 голосов
/ 08 апреля 2020

Путем «копирования-вставки» из Интернета, не понимая, что происходит, я сделал свой файл .htaccess следующим образом:

Options +FollowSymLinks -MultiViews -Indexes

ErrorDocument 404 /index.php?notfound=1  # (a)

FallbackResource /index.php?notfound=1  # (b)

RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [NC,QSA,L]  # (c)

Я чувствую, что директивы (a) и (b) не являются полезно из-за (c) ... я прав?

В чем реальная разница между этими 3 директивами?

1 Ответ

2 голосов
/ 09 апреля 2020

В чем реальная разница между этими 3 директивами?

Они все здесь делают более или менее одно и то же.

ErrorDocument 404 и FallbackResource оба установлены данный скрипт как обработчик для всего, что в противном случае вызвало бы 404, потому что запрошенный URI не отображается ни на какой существующий файл или папку.

Я думаю, что основное отличие здесь будет в том, что с ErrorDocument 404 you ' Я по-прежнему получаю запись в журнале ошибок сервера каждый раз, тогда как с FallbackResource подразумевается, что это должен быть фронт-контроллер, так что он не будет загрязнять ваши журналы. Если вам нужна какая-либо информация о том, что фактический 404s произошла, - вам придется регистрировать их самостоятельно из своей системы, после того как будет установлено, что на самом деле не найдено никакого контента для обслуживания по запрошенному URI.

Версия Rewrite - это просто версия старой школы, в документации FallbackResource прямо упоминается, что https://httpd.apache.org/docs/2.4/mod/mod_dir.html#fallbackresource:

It Часто желательно, чтобы один файл или ресурс обрабатывал все запросы к конкретному каталогу, кроме тех запросов, которые соответствуют существующему файлу или сценарию. Это часто называют «фронт-контроллером».

В более ранних версиях httpd этот эффект обычно требовал mod_rewrite и использования тестов -f и -d для существования файлов и каталогов. Теперь для этого требуется только одна строка конфигурации.

Так что для любого из первых двух вам даже не нужно, чтобы mod_rewrite был доступен (чего иногда не может быть, на дешевом виртуальном хостинге или чем-то еще). .)

Версия Rewrite, как показано выше, будет передавать первоначально запрошенный URI под именем параметра url, поэтому у вас есть доступ к нему с использованием $_GET['url']. При использовании любого из первых двух он не передается явно в новом внутренне переписанном URL-адресе, поэтому вам необходимо получить доступ к нему из серверных переменных, как объяснено ниже несколькими строками:

Резервный обработчик (в приведенном выше случае /blog/index.php) может получить доступ к исходному запрошенному URL-адресу через переменную сервера REQUEST_URI. Например, чтобы получить доступ к этой переменной в PHP, используйте $_SERVER['REQUEST_URI'].

Использование mod_rewrite для подобных вещей по-прежнему имеет смысл, если вы не хотите переписывать все запросы к одному и тому же сценария, или вы не хотите выполнять синтаксический анализ параметров в PHP - как вы, возможно, захотите переписать products/foo в products.php?product=foo и profile/username в profile.php?user=username.

ErrorDocument 404 и FallbackResource не позволят этого, в частности, mod_rewrite с различными наборами правил, которые конкретно соответствуют этим сегментам пути, может сделать это, однако.

Я предполагаю, используя * В наши дни большинство будет считать 1053 * самым современным, а обработка парсинга URL и принятие решения о том, что должно произойти на основе этого, обычно считается более логично размещенной в части сценариев сайта. / application, вместо того, чтобы хранить это в отдельном месте, например .htaccess.

...