Проблема перенаправления 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:

линия матча также работает без раздела .htaccess и дает ожидаемые результаты.


другая возможность-не беспокоиться о том, чтобы соответствовать всему пути:

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.