Перенаправить на Apache встроенную страницу 404 с помощью mod_rewrite?
Есть ли способ активно использовать Apache по умолчанию, встроенную 404 страницу для нескольких URL-адресов с помощью mod_rewrite? Не пользовательский документ ошибки, но правило вроде
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule -- serve 404 page -----
Я знаю, как создать страницу PHP, которая отправляет заголовок 404, и mod_rewrite
перенаправить все URL-адреса, но я предпочел бы решение, основанное только на mod_rewrite
.
У меня появилась идея перенаправления на несуществующий адрес:
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf
но это даст пользователю сообщение "/sflkadsölfkasdfölkasdflökasdf" на странице с ошибкой, которая выглядит немного непрофессиональной.
Ответы
Ответ 1
Вы можете использовать флаг R
на RewriteRule
, чтобы принудительно перенаправить с заданным кодом состояния:
Хотя это обычно используется для перенаправления, здесь может быть указан любой действительный код состояния. Если код состояния находится за пределами диапазона перенаправления (300-399), то строка Substitution отбрасывается и переписывание останавливается, как если бы использовался флаг L.
Итак, это:
RewriteRule ^/?page\.html$ - [R=404]
вернет страницу 404 по умолчанию для /page.html
. Поскольку это регулярное выражение, помните escape \.
и привязку $
.
-
игнорируется (т.е. "строка замещения отбрасывается" ), но там все равно должно быть что-то, чтобы сохранить правильное правильное правило.
Ответ 2
Лучший способ сделать это - установить флаг R со статусом 404:
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]
Но это доступно только с Apache 2.
Ответ 3
Я подтверждаю, что
RewriteRule ^ - [L,R=404]
или
RewriteRule ^ - [L,redirect=404]
не будет работать. Вот объяснение с официального сайта Apache:
Однако, если код состояния находится за пределами диапазона перенаправления (300-399), тогда строка замены полностью отбрасывается, и переписывание остановлено как если бы использовался L.
Таким образом, лучшим решением является перенаправление на файл 404.php с заголовком 404, как описано ниже.
Ответ 4
Это должно работать:
RewriteEngine on
RewriteRule ^/page.html /error404.html [L]
Это не даст заголовок 404. Вы можете попробовать перевести флаг на [L,R=404]
, но я сомневаюсь, что он будет работать (он должен быть только для перенаправления).
Ваша идея сделать это в PHP будет работать. Если все ваши страницы "страницы ошибок" являются серверными (то есть PHP), вы можете просто использовать этот код:
<?php
header( 'HTTP/1.0 404 Not Found' );
include 'error404.html';