Проблема перенаправления 403 Forbidden на 404 не найдена
соответствующая часть моей .htaccess выглядит так:
Options -Indexes
<FilesMatch include>
Order allow,deny
Deny from all
</FilesMatch>
RedirectMatch 404 ^/include(/.*)$
и он генерирует следующие ответы:
- /включать 403
- /включать/ 404
- / include / config.inc 403
Я могу сказать, глядя на мой шаблон, что проблема, вероятно, в ( / .* ) часть, но все, что я пробовал, дает мне те же результаты; вместо того, чтобы последовательно получать 404, я получаю 404 для одного случая и 403 для все остальное. что не так с выражением, которое я использую? В качестве альтернативы, поскольку я должен сделать это для нескольких каталогов, есть ли общий подход, который позволил бы мне преобразовать все 403 ответа в 404?
обновление: я обнаружил, что, удалив FileMatch, я получаю лучшие результаты, поэтому мой .откройте файл. htaccess сейчас выглядит так:
Options -Indexes
RedirectMatch 404 ^/include(/.*)?$ # Added dlamblin's first suggestion
и получаем следующие ответы:
- /включать 404
- /включать/ 404
- / include / config.inc 403
обновление: интересно, что я обнаружил, что следующее производит разные выходные данные:
RedirectMatch 404 ^/include(/?|/.*)$
RedirectMatch 404 ^/template(/?|/.*)$
шаблон шаблона работает во всех случаях, однако include по-прежнему генерирует 403 для всех файлов include (например, /include/config.inc)это может быть проблема с именем каталога, а не проблема .файл htaccess себя?
обновление: следующее В моем .htaccess конфликтовал с перенаправлением при доступе к /include / config.Инк.
<FilesMatch config>
Order allow,deny
Deny from all
</FilesMatch>
7 ответов
Я могу понять, почему /include не пойман вашим RedirectMatch, вы не делаете end '/' необязательным, однако /include/config.часть inc немного озадачивает.
вот что я получил для работы над Apache 2.2:
<FilesMatch /include(/?|/.*)>
Order allow,deny
Deny from all
</FilesMatch>
RedirectMatch 404 ^/include(/?|/.*)$
Это обрабатывает эти случаи:
/include 404
/include/ 404
/include/config.inc 404
мне пришлось изменить часть FilesMatch, чтобы часть /include работала правильно.
EDIT:
линия матча также работает без раздела
другая возможность-не беспокоиться о том, чтобы соответствовать всему пути:
RedirectMatch 404 ^/include
Если есть общедоступные пути URL, которые могут начинаться с " / include "(скажем," /includeMe"), небольшое добавление отделит частные от общедоступных url:
RedirectMatch 404 ^/include(/|$)
С переписать mod:
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/\.
RewriteRule ^(.*)$ - [R=404]
каждый файл или dir, которые начинаются с точки, будут перенаправлены на 404.
/myDir/.svn => 404
/.gitignore => 404
/dir1/dir2_dir3/
или чтобы изменить все 403,400 ошибок на 404 ошибки, поместите это в конце / etc/apache2 / conf.D / localized-error-pages или .реврайт
# 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."
разве вы не хотите ' ^ / include(/.*)?$'
эта часть-догадка, но что произойдет, если вы поместите RedirectMatch над блоком. Таким образом, вы не будете отказывать (запрещать) доступ к запросу, прежде чем перенаправлять этот запрос на 404.
лучший и простой способ заключается в следующем:
1 - Вставьте в свой основной conf (т. е. вне VHOST мира):
<IfModule mod_alias.c>
RedirectMatch 404 ^/myDirectory(?|\/)$
</IfModule>
С myDirectory = css, js, изображения ...
2 - Вы можете установить в каталог -индексы следующим образом :
разрешить содержание директивы Apache" DirectoryIndex":
<Directory "/myPathtoMyWebDocRoot/">
Options Indexes
AllowOverride None
Order Allow, Deny
Allow from all
</Directory>
и запретить индекс каталога для других:
<Directory "/myPathtoMyWebDocRoot/myDirectory/">
Options -Indexes
AllowOverride None
Order Allow, Deny
Allow from all
</Directory>
С myDirectory = *, css, images, js, secret,... следовать вашим потребностям.
это работает как ожидалось для всех файлов / dirs с именем, запущенным точкой даже в подкаталогах:
<FilesMatch "^\..+">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
RedirectMatch 404 \/\..+$
В этом случае вам не нужно использовать Options -Indexes
Мое решение прекратить отображение содержимого каталога в виде списка и отображать ошибку 404 просто. Создавать.htaccess файл в корневом каталоге вашего проекта и написать, какие каталоги должны быть защищены.
структура каталогов
- your_root_directory
- .htaccess
- 404.html
- index.html
- app
- other files I do not want to show
- models
- other files I do not want to show
.реврайт
RewriteEngine On
RewriteRule ^app/ - [R=404,L]
RewriteRule ^models/ - [R=404,L]
ErrorDocument 404 /your_root_directory/404.формат html Вторая строка .откройте файл. htaccess запретить доступ к элементам списка в приложения каталог и все его субридекториев.
третья строка .откройте файл. htaccess запретить доступ к элементам списка в моделях каталога и всех его subridectories.
четвертое .строка htaccess устанавливает нашу собственную ошибку 404 (если вы не хотите показывать ошибку по умолчанию apache).
не забудьте очистить кэш в браузере при работе с htaccess.