Всегда возвращайте 404, когда вы решите вернуть 403
Здесь есть несколько вопросов о возврате 404 вместо 403 в особых случаях (например,.ht * файлы или определенный каталог), но я не могу понять, как просто заменить все 403 ответа ( "Хорошо, это существует, но вам еще нужно найти способ" ) с 404s ( "Извините, никогда не слышал об этом" ). Я надеюсь, что существует простое решение, которое не требует обновления регулярных выражений или других битов .htaccess для соответствия изменениям сайта, просто простая директива: "всякий раз, когда вы решите вернуть 403, верните 404 вместо", который применяется на весь сайт, независимо от изменений конфигурации.
Затем, если верхний уровень .htaccess содержит "Параметры -Indexes", и любой данный каталог не содержит index.html(или equiv), URL-адрес голого каталога вернет 404, но если я когда-нибудь добавлю index.html к этот каталог, тот же самый URL-адрес голого каталога вернет index.html, без обновлений, необходимых для любого файла .htaccess.
Мне все равно, если в случае, когда я когда-либо запишу пароль в каталоге, неправильный пароль возвращает 404 (из-за 404 → 403 отображения). В этом случае я ничего не скрываю, возвращая 404, но это тоже не причиняет вреда. Если есть путь к UNDO, общее сопоставление 403- > 404 для особых случаев (а не DO для особых случаев), тем не менее, это может быть еще более полезным.
Конечно, если я что-то пропущу, пожалуйста, поставьте меня прямо.
EDIT: Drat. Я пытался написать здесь качественный вопрос, но мое описание поведения "Опции -Indexes" во втором абзаце оказывается неправильным. Без этой строки голый URL-адрес каталога показывает "index.html", если он существует в каталоге; в противном случае он отображает содержимое каталога. (Что пересылка /dir в/dir/index.html, если index.html существует, является установкой по умолчанию для веб-хоста по умолчанию, если только я не ошибаюсь.) Добавление строки "Параметры -Indexes" останавливает ее прошивку моей стирки публично ( возвращая 403, а не 404, но все же лучше, чем просмотр содержимого dir), но теперь голый URL-адрес каталога возвращает 403, даже если существует index.html.
Я хочу, чтобы в нем отсутствовал пустой URL-адрес "mysite.com/mydir" /mydir/index.html, если он существовал, и "404", если он этого не сделал, но, очевидно, ему больше, чем просто заменить 403s на 404s.
Ответы
Ответ 1
Чтобы получить один из лучших ответов здесь (как упоминалось @WebChemist и @JennyD), хорошим способом решить эту проблему является возврат 404 Not Found
из документа, который вы используете для обработки ошибок 403
. Лично я делаю что-то вроде следующего:
.htaccess
в веб-корне (соответствующая выдержка):
ErrorDocument 400 /http-errors.php
ErrorDocument 403 /http-errors.php
ErrorDocument 404 /http-errors.php
http-errors.php
в веб-корне (сжатый рабочий пример):
<?php
$status = $_SERVER['REDIRECT_STATUS'];
// If it 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>";
Ответ 2
Вы можете легко сделать подделку 403 → 404, выполнив
ErrorDocument 403 /404.php
Где 404.php - это отформатированная страница ответа 404, но это все равно вернет 403 в заголовок ответа. Если вы хотите вернуть заголовок 404, вы можете сделать страницу 403 с перенаправлением заголовка, которая возвращает код 404, но перенаправление может все еще быть видимым....
Не уверен, что вы можете сделать подменю 403- > 404 с чистым .htaccess
Edit:
играл с помощью бит, 2 чистых метода .htaccess, которые вы можете попробовать:
1) сделать любой URL-адрес, заканчивающийся перекосом косой черты на индексную страницу, например:
RewriteRule ^(.*)/$ /$1/index.php [NC,L]
поэтому, если у вас есть индексная страница, она будет отображаться, но если это не будет 404 в запросе отсутствующей индексной страницы. Если вы не укажете [R], url по-прежнему будет отображаться как /un index.php канонический URL-адрес дружественного SEO:) не может сказать, что это не вызовет проблемы в другом месте, хотя..
2)
в правиле перезаписи вы можете использовать r = 404 для возврата кода 404.
RewriteRule ^(.*)/$ - [R=404, NC,L]
однако
RewriteCond %{REQUEST_FILENAME} !-f
или
RewriteCond %{REQUEST_FILENAME} -d
не помогите, то есть все конечные косые черты будут 404, даже если указана страница. Вы можете исправить это, указав папки для защиты (или игнорирования) в дополнительных правилах RewriteCond, но это не будет точно "автоматическим", поскольку вам придется добавлять правила RewriteCond, поскольку добавляется больше папок для защиты | ignore
Ответ 3
Вот фрагмент из моего файла .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]
Ответ 4
Насколько мне известно, такой простой директивы нет. Это все еще возможно, но это немного сложнее, чем вам может понравиться.
Вы можете использовать директиву ErrorDocument, чтобы задать 403 ответа на script, а затем ответьте script на ответ 404 вместо 403. Есть несколько советов по apache.org, которые могут быть полезны
Ответ 5
Есть надежда, хотя, вероятно, нет пустого способа получить 403 ошибки, чтобы сообщить о 404 ошибках.
Я подозреваю, что вы действительно хотите обеспечить /~ root (и любой другой существующий, не HTTP-пользователь) не возвращает 403, а 404.
Директива UserDir в Apache возвращает 403 по дизайну. Я не думаю, что в настоящее время можно изменить. НО: директива 'UserDir' может использоваться несколько раз в одном файле Apache:
UserDir public_html
UserDir отключить root 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, и он работает - даже при тестировании с чем-то вроде curl. Я также искал решение этого. Наконец нашел что-то, с чем я могу работать!