Перенаправить на страницу Apache 404 с mod_rewrite? - PullRequest
29 голосов
/ 15 марта 2010

Есть ли способ активно обслуживать 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 не существует" на странице ошибок, которая выглядит немного непрофессионально.

Ответы [ 4 ]

45 голосов
/ 15 марта 2010

Вы можете использовать флаг R на RewriteRule для принудительного перенаправления с данным кодом состояния:

Хотя это обычно используется для перенаправлений, здесь можно указать любой действительный код состояния. Если код состояния находится вне диапазона перенаправления (300–399), то строка подстановки удаляется, а перезапись прекращается, как если бы использовался флаг L.

Итак, это:

RewriteRule ^/?page\.html$ - [R=404]

вернет страницу 404 по умолчанию для /page.html. Поскольку это регулярное выражение, запомните экранирование \. и привязку $.

- игнорируется (т. Е. «Строка подстановки отбрасывается»), но все еще должно быть что-то там, чтобы сохранить правило правильно сформированным.

11 голосов
/ 15 марта 2010

Лучший способ сделать это - установить флаг R с кодом состояния 404:

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]

Но это доступно только после Apache 2.

5 голосов
/ 07 января 2013

Я подтверждаю, что

RewriteRule ^ - [L,R=404]

или

RewriteRule ^ - [L,redirect=404]

не будет работать. Вот объяснение с официального сайта Apache:

Однако, если код состояния находится вне диапазона перенаправления (300-399), тогда строка подстановки полностью отбрасывается, а перезапись прекращается как если бы L были использованы.

Итак, лучшее решение - перенаправить в файл 404.php с заголовком 404, как будет объяснено позже.

2 голосов
/ 15 марта 2010

Это должно работать:

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...