Перенаправить на 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';
Другие вопросы по тегам