Apache DirectorySlash Off - разрывы сайта - PullRequest
7 голосов
/ 15 июля 2010

Если я установлю DirectorySlash Off в моем .htaccess файле и вызову каталог без завершающего слеша, я получу 403-Forbidden с моего сервера.Если я позвоню с косой чертой, все будет хорошо.

Может кто-нибудь объяснить, почему?Вот мои полностью анонимные .htaccess:

# GLOBAL CONFIG
Options +FollowSymlinks
DirectorySlash Off
AddDefaultCharset utf-8
php_value post_max_size 256M
php_value upload_max_filesize 256M

# BEGIN WordPress
RewriteEngine On
RewriteBase /folder/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /folder/index.php [L]
# END WordPress

# REMOVE WWW
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain.com$1 [R=301,L]

Ответы [ 3 ]

12 голосов
/ 18 июля 2010

Как известно из документации, когда DirectorySlash установлено на Off, запросы на /folder не оцениваются DirectoryIndex. Это означает, что запрос не будет автоматически сопоставлен с /folder/index.php.

mod_dir выполняет эту проверку на этапе «исправления» обработки запроса. mod_rewrite, отвечающий за ваши RewriteRule определения, также выполняет его обработку на этом этапе, когда вы указываете правила в файле .htaccess.

Однако он был запрограммирован с учетом таких модулей, как mod_dir, и включает проверку, чтобы убедиться, что текущий каталог был запрошен с косой чертой. В противном случае он отклоняет запрос, поскольку это может привести к неопределенному поведению.

Затем запрос переходит к фазе генерации контента, которая, поскольку запрос не был сопоставлен с реальным файлом, обрабатывается mod_autoindex. Учитывая, что Indexes по умолчанию отключены на вашем хосте, mod_autoindex возвращает 403 Forbidden, что вы и видите.

Обратите внимание, что, поскольку DirectoryIndex не оценивается, даже если mod_rewrite были для обработки запроса, он все равно завершится ошибкой, поскольку не произойдет автоматическое разрешение до index.php, и ваше правило

RewriteRule . /folder/index.php [L]

не будет соответствовать, потому что . требует совпадения с чем-то (но запрос будет пустым).

Включение DirectorySlash предотвращает этот сценарий, исправляя запрещенные действия во всех ранее упомянутых сценариях, кроме последней заметки, о которой заботится тот факт, что DirectoryIndex сопоставляет запрос с index.php в любом случае.

8 голосов
/ 23 февраля 2012

В Apache 2.4 вы можете разрешить перезапись в файлах .htaccess, установив RewriteOptions AllowNoSlash.

 Changes with Apache 2.3.16
 ...
 *) mod_rewrite: Add the AllowNoSlash RewriteOption, which makes it possible
    for RewriteRules to be placed in .htaccess files that match the directory
    with no trailing slash. PR 48304.
    [Matthew Byng-Maddick <matthew byng-maddick bbc.co.uk>]
 ...

См. Документация Apache для mod_rewrite

2 голосов
/ 15 июля 2010

Я думаю, потому что, когда вы выключаете DirectorySlash, он отключает автокоррекцию URL-адреса и пытается показать список каталогов, но, к счастью, вы, вероятно, где-то отключили это (или в разрешениях для файлов), поэтому он отправляет 403-Forbidden. Я думаю, что когда вы включаете его, он работает нормально. Из того, что я понимаю из документов, не очень хорошо использовать DirectorySlash для безопасности. http://httpd.apache.org/docs/2.1/mod/mod_dir.html

...