В чем реальная разница между этими 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.