Проблема с перенаправлением 403 Запрещено на 404 Не найдено - PullRequest
6 голосов
/ 14 февраля 2009

Соответствующая часть моего .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(/?|/.*)$

Шаблон шаблона работает во всех случаях, однако, все еще включается генерирование 403 для всех включаемых файлов (например, /include/config.inc) Может ли это быть проблемой с именем каталога, а не проблемой с .htaccess сам файл?

ОБНОВЛЕНИЕ: Следующее в моем .htaccess конфликтовало с перенаправлением при доступе к /include/config.inc.

<FilesMatch config>
    Order allow,deny
    Deny from all
</FilesMatch>

Ответы [ 7 ]

6 голосов
/ 14 февраля 2009

Я могу понять, почему / include не перехватывается вашим RedirectMatch, вы не делаете конец '/' необязательным, однако часть /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:

Строка соответствия также работает без раздела в .htaccess и дает ожидаемые результаты.

4 голосов
/ 09 июля 2010

Еще одна возможность не беспокоить совпадение всего пути:

RedirectMatch 404 ^/include

Если есть общедоступные URL-пути, которые могут начинаться с «/ include» (скажем, «/ includeMe»), небольшое добавление отделяет приватные и общедоступные URL-адреса:

RedirectMatch 404 ^/include(/|$)
2 голосов
/ 29 октября 2013

с модом перезаписи:

RewriteEngine on

RewriteCond %{THE_REQUEST} ^.*/\.
RewriteRule ^(.*)$ - [R=404]

Каждый файл или каталог, начинающийся с точки, будет перенаправлен на 404.

/myDir/.svn => 404
/.gitignore => 404
/dir1/dir2_dir3/

Или чтобы заменить все 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."
1 голос
/ 09 октября 2013

Лучший и простой способ выглядит следующим образом:

1 - Вставьте в свой основной конф (т.е. вне мира VHOST):

<IfModule mod_alias.c>
RedirectMatch 404 ^/myDirectory(?|\/)$
</IfModule>

с myDirectory = css, js, images ...

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, ... в соответствии с вашими потребностями.

1 голос
/ 14 февраля 2009

Разве вы не хотите '^ / include (/.*)?$'

Эта часть является предположением, но что произойдет, если вы поместите RedirectMatch над блоком. Таким образом, вы не запретите (запретите) доступ к запросу, прежде чем перенаправить этот запрос на номер 404.

0 голосов
/ 18 января 2017

В этом случае вам не нужно использовать 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

.htaccess

RewriteEngine On
RewriteRule   ^app/ - [R=404,L]
RewriteRule   ^models/ - [R=404,L]

ErrorDocument 404 /your_root_directory/404.html Вторая строка .htaccess запрещает доступ к элементам списка в каталоге приложения и всех его подкаталогах.

Третья строка .htaccess запрещает доступ к элементам списка в каталоге моделей и всех его подкаталогах.

Четвертая строка .htaccess устанавливает нашу собственную ошибку 404 (если вы не хотите показывать ошибку по умолчанию apache).

Не забудьте очистить кеш в вашем браузере при работе с htaccess.

0 голосов
/ 16 мая 2012

Это работает, как и ожидалось, для всех файлов / каталогов с именем, начинающимся с точки, даже в подкаталогах:

<FilesMatch "^\..+">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>
RedirectMatch 404 \/\..+$
...