Перенаправить на Apache встроенную страницу 404 с mod_rewrite?
Есть ли способ активно обслуживать стандартную встроенную страницу 404 Apache для ряда 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 не существует" на странице ошибок, которая выглядит немного непрофессионально.
4 ответа
Вы можете использовать R
флаг на RewriteRule
для принудительного перенаправления с данным кодом состояния:
Хотя это обычно используется для перенаправлений, здесь может быть указан любой действительный код состояния. Если код состояния находится за пределами диапазона перенаправления (300–399), то строка подстановки удаляется, а перезапись останавливается, как если бы использовался флаг L.
Итак, это:
RewriteRule ^/?page\.html$ - [R=404]
вернет страницу по умолчанию 404 для /page.html
, Так как это регулярное выражение, помните, экранирование \.
и закрепление $
,
-
игнорируется (т. е. "строка подстановки отбрасывается"), но для того, чтобы правило было правильно сформировано, должно быть что-то еще.
Лучший способ сделать это - установить флаг R с кодом состояния 404:
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]
Но это доступно только начиная с Apache 2.
Я подтверждаю, что
RewriteRule ^ - [L,R=404]
или же
RewriteRule ^ - [L,redirect=404]
не сработает Вот объяснение с официального сайта Apache:
Однако, если код состояния находится вне диапазона перенаправления (300–399), тогда строка подстановки полностью удаляется, и перезапись прекращается, как если бы использовался символ L.
Таким образом, лучшим решением является перенаправление в файл 404.php с заголовком 404, как будет объяснено позже.
Это должно работать:
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';