Вопрос

Есть ли способ настроить веб-сервер Apache так, чтобы он возвращал код ошибки 404 (не найден) вместо 403 (запрещено) для некоторых конкретных каталогов, доступ к которым я хочу запретить?

Я нашел несколько решений, предлагающих использование mod_rewrite, например.

RewriteEngine On
RewriteRule ^.*$ /404 [L]

Поскольку цель отправки 404 вместо 403 — запутать структуру каталогов, это решение слишком показательно, поскольку оно перенаправляет в какое-то другое место, что делает очевидным, что каталог, к которому первоначально обращались, действительно существует.

Это было полезно?

Решение

РедиректМатч как, например,

RedirectMatch 404 ".*\/\..*"

делает свое дело, он запрещает доступ ко всем файлам или каталогам, начинающимся с точки, выдавая ошибку «404 Not Found».

Из руководства Apache:«Директива перенаправления [Match] отображает старый URL -адрес в новую, попросив клиента опровергнуть ресурс в новом месте». По умолчанию, Перенаправление отправляет код возврата 302, но может также возвращать другие коды состояния, как показано выше.

Другие советы

Вы можете сделать что-то вроде этого:

.htaccess

ОшибкаДокумент 403 /error/404.php

404.php

<?php
$status = $_SERVER['REDIRECT_STATUS'] = 404;
header( $_SERVER['SERVER_PROTOCOL'] . ' ' . $status);
?>

404 Error

После той же проблемы у меня появился следующий файл .htaccess.

Options -Indexes
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain.com [NC]
RewriteRule ^(.*)/$ - [R=404,NC]

Первая и третья строки гарантируют, что вы не сможете перечислить содержимое папки, и если вы это сделаете, вы получите ошибку 404.А RewriteCond Директива гарантирует, что это правило перезаписи применяется только к основному домену.Поскольку у меня есть несколько поддоменов без rewritecond, доступ к www.mydomain.com/subdomain также возвращал 404, что было не тем, что я намеревался.

Чтобы изменить все ошибки 403 400 на ошибки 404, поместите это в конец /etc/apache2/conf.d/localized-error-pages ИЛИ в .htaccess

# Will raise a 404 error, because the file <fake_file_for_apache_404.php> doesn't exist.
# We change 403 or 400 to 404 !
ErrorDocument 400 /fake_file_for_apache_404.php
ErrorDocument 403 /fake_file_for_apache_404.php
# We need to rewrite 404 error, else we will have "fake_file_for_apache_404.php not found"
ErrorDocument 404 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL <script type=\"text/javascript\">document.write(document.location.pathname);</script> was not found on this server.</p></body></html>"
ErrorDocument 500 "Server in update. Please comme back later."
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top