Подтвердить что ты не робот

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

4b9b3361

Ответ 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';