Всегда возвращать 404, когда вы решите вернуть 403

здесь уже есть несколько вопросов о возвращении 404 вместо 403 в особых случаях (например, .HT * файлы или определенный каталог), но я не могу понять, как просто заменить все 403 ответа ("Хорошо, он существует, но вам все равно нужно найти способ") с 404 ("извините, никогда не слышал об этом"). Я надеюсь, что есть простое решение, которое не потребует обновления регулярных выражений или других бит .htaccess для соответствия изменениям сайта, просто простая директива: "всякий раз, когда вы решите вернуть 403, вместо этого верните 404", который применяется ко всему сайту, независимо от изменений конфигурации.

тогда, если верхний уровень .htaccess содержит "параметры-индексы", а любой данный каталог не содержит индекса.html (или equiv), голый URL-адрес каталога вернет 404, но если я когда-либо добавлю индекс.html в этот каталог, тот же самый голый URL-адрес каталога вернет индекс.HTML, где нет обновления, необходимые для любой .файл htaccess.

Мне все равно если в случае, если я когда-либо вводил пароль в каталог, плохой пароль возвращает 404 (из-за сопоставления 404 - > 403). В этом случае я ничего не скрываю, возвращая 404, но это также не причиняет никакого вреда. Если есть способ отменить общее отображение 403->404 для особых случаев (а не делать это для особых случаев), это может быть еще более полезным.

конечно, если я что-то упускаю, пожалуйста, поставьте меня прямо.

EDIT: черт. Я пытался написать хорошее качество вопрос здесь, но мое описание поведения "опций-индексов" во втором абзаце оказывается неправильным. Без этой строки голый URL-адрес каталога показывает " индекс.html", если он существует в каталоге; в противном случае он показывает содержимое каталога. (Эта пересылка /dir в /dir/index.HTML, если индекс.html exists-это настройка веб-узла По умолчанию, если я не ошибаюсь.) Добавление строки "Options-Indexes" останавливает проветривание моей прачечной публично (возвращая 403, а не 404, но все же лучше чем разоблачение содержимого dir), но теперь URL-адрес голого каталога возвращает 403, даже если индекс.HTML-код существует.

Я хочу голый URL dir "mysite.com/mydir" отображается /mydir / index.html, если он существовал, и "404", если нет, но ясно, что это больше, чем просто замена 403 на 404.

5 ответов


чтобы завершить один из лучших ответов здесь (как упоминалось @WebChemist и @JennyD), хороший способ решить эту проблему-вернуться 404 Not Found из документа, который вы используете для обработки 403 ошибки. Лично я делаю что-то вроде следующего:

.htaccess в корне web (соответствующей выпиской):

ErrorDocument 400 /http-errors.php
ErrorDocument 403 /http-errors.php
ErrorDocument 404 /http-errors.php

http-errors.php в корне web (сокращенный рабочий пример):

<?php

$status = $_SERVER['REDIRECT_STATUS'];
// If it's a 403, just bump it up to a 404
if ( $status == 403 ) $status++;

$codes = array(
  400 => array( '400 Bad Request', 'The request cannot be fulfilled due to...' ),
  404 => array( '404 Not Found', 'The resource you requested was not found...' ),
  500 => array( '500 Internal Server Error', 'The request was unsuccessful...' )
);

$title = $codes[$status][0];
$message = $codes[$status][1];

header( $_SERVER['SERVER_PROTOCOL'] . ' ' . $title );
echo "<h1>$title</h1>\n<p>$message</p>";

вы можете легко сделать поддельный 403 - > 404, делая

ErrorDocument 403 /404.php

где 404.php-это ваша отформатированная страница ответа 404, но это все равно вернет 403 в заголовке ответа. Если вы хотите вернуть заголовок 404, вы можете сделать страницу 403 с перенаправлением заголовка, которое возвращает код 404, но перенаправление все еще может быть видимым....

не совсем уверен, что вы можете сделать замену catchall 403 - >404 с чистым .реврайт

Edit:

поиграл немного, 2 чисто .методы htaccess вы можете попробовать:

1) Сделайте любой url, заканчивающийся переадресацией косой черты на индексную страницу, например:

RewriteRule ^(.*)/$ //index.php [NC,L]

поэтому, если у вас есть индексная страница, она будет отображаться, но если нет, это будет 404 на отсутствующем запросе индексной страницы. Если вы опустите [R], url-адрес по-прежнему будет отображаться как индекс / non.PHP канонический SEO дружественный url:) не могу сказать, что это не вызовет проблемы в другом месте..

2)

в правиле перезаписи вы можете использовать r=404 для возврата кода 404.

RewriteRule ^(.*)/$ - [R=404, NC,L]

RewriteCond %{REQUEST_FILENAME} !-f или RewriteCond %{REQUEST_FILENAME} -d

не помогает, то есть все конечные косые черты будут 404, даже если присутствует страница индекса. Вы можете исправить это, указав папки для защиты (или игнорирования) в дополнительных правилах перезаписи, но это не будет точно "автоматически", так как вам придется добавлять правила перезаписи по мере добавления дополнительных папок чтобы защитить / игнорировать


вот фрагмент из моей .файл htaccess, который находится в каталоге, который я заблокировал, но разрешил доступ с компьютеров LAN. Возвращает ошибку 404 каждый раз!!

# Turn rewrite engine on
RewriteEngine on
RewriteOptions Inherit

# Make it for a specific directory
# RewriteBase /phpMyAdmin 

# Block everyone except me
RewriteCond %{REMOTE_HOST} !^192.168.2
RewriteRule .? - [R=404,L]

насколько мне известно, такой простой директивы нет. Это еще возможно, но это немного сложнее, чем вам может понравиться.

вы можете использовать директиву ErrorDocument для установки 403 ответов на скрипт,а затем этот скрипт отвечает С 404 ответом вместо 403. Есть несколько советов поapache.org это может быть полезно


есть надежда, хотя, вероятно, нет общего способа получить 403 ошибки, чтобы сообщить об ошибках 404.

Я подозреваю, что вы действительно хотите, чтобы /~root (и любой другой существующий, не HTTP-пользователь) не возвращал 403, но 404.

директива UserDir в Apache возвращает 403 по дизайну. Не думаю, что сейчас это можно изменить. Но -- директива UserDir может использоваться несколько раз в одном файле Apache, например:

каталог пользователя public_html UserDir отключить корень someuser1 someuser1

эта конфигурация позволит использовать UserDir, но также сообщит заветный заголовок ответа 404 всем тем, кто пытается обнюхать вашу систему.

Я нашел этот совет по следующей ссылке:

http://www.if-not-true-then-false.com/2010/enable-apache-userdir-with-selinux-on-fedora-centos-red-hat-rhel/

Я сам тестировал его в Apache 2.2.15 под RHEL 6.3 и это работает-даже при тестировании с чем-то вроде завитка. Я также искал решение этой проблемы. Наконец-то нашел то, с чем я могу работать!