2010-07-15 9 views
6

Wenn ich DirectorySlash Off in meiner .htaccess-Datei festgelegt und rufen Sie das Verzeichnis ohne den abschließenden Schrägstrich i ein 403-Forbidden von meinem Server. Wenn ich es mit Schrägstrich anrufe, funktioniert alles gut.Apache DirectorySlash Off - Site bricht

Kann jemand erklären warum? Hier sind meine voll .htaccess anonymisierter:

# 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] 

Antwort

11

Wie Sie pro der Dokumentation kennen, wenn DirectorySlash-Off gesetzt ist, Anfragen an /folder nicht über DirectoryIndex ausgewertet. Dies bedeutet, dass die Anfrage nicht automatisch auf /folder/index.php abgebildet wird.

mod_dir führt diese Überprüfung in der "Fixup" -Phase der Anfrageverarbeitung durch. mod_rewrite, die für Ihre RewriteRule Definitionen verantwortlich ist, führt auch ihre Verarbeitung in dieser Phase durch, wenn Sie die Regeln in einer .htaccess Datei angeben.

Es wurde jedoch mit einem Bewusstsein für Module wie mod_dir programmiert und enthält eine Überprüfung, um sicherzustellen, dass das aktuelle Verzeichnis mit einem abschließenden Schrägstrich angefordert wurde. Wenn nicht, lehnt es die Bearbeitung der Anfrage ab, da dies zu undefiniertem Verhalten führen könnte.

Die Anfrage geht dann in die Phase der Inhaltserzeugung über, die, da die Anfrage keiner realen Datei zugeordnet wurde, von mod_autoindex gehandhabt wird. Vorausgesetzt, dass Indexes auf Ihrem Host standardmäßig deaktiviert sind, gibt mod_autoindex403 Forbidden zurück, was Sie sehen.

Hinweis seit DirectoryIndex dass nicht ausgewertet wird, auch wenn mod_rewrite die Anforderung zu verarbeiten, wäre es immer noch nicht, da keine automatische Auflösung index.php auftreten würde, und die Regel

RewriteRule . /folder/index.php [L] 

wouldn‘ t passen, weil die . erfordert eine Übereinstimmung für etwas (aber die Anfrage wäre leer).

DirectorySlash Aktivieren verhindern dieses Szenario durch die verhinderten Aktionen in allen zuvor genannten Szenarien mit Ausnahme der letzten Note zu korrigieren, die der Versorgung durch die Tatsache gemacht, dass DirectoryIndex ordnet die Anfrage an index.php sowieso.

+0

Vielen Dank! Einfach zu verstehen, wenn ich Ihre Antwort gelesen habe. – gearsdigital

+0

Aber was, wenn wir unsere Verzeichnisstruktur verschleiern und trotzdem 'mod_rewrite' für jede Anfrage verwenden wollen? Angenommen, ich habe eine Site mit einem '/ private' -Verzeichnis. Apache würde mich zu '/ private /' umleiten, wenn ich '/ private' anfordere, wenn' DirectorySlash' auf 'On' gesetzt ist, und die Offenlegung von Informationen zulassen würde. Was, wenn ich nur '/ private' an meinen' Index senden möchte. php' Front Controller? – tonix

2

Ich denke, denn wenn man DirectorySlash ausschalten, den Autokorrektur der URL deaktivieren, und es wird versucht, die Verzeichnisliste zu zeigen, aber zum Glück haben Sie wahrscheinlich diese irgendwo deaktiviert (oder in Dateiberechtigungen) so sendet es eine 403-Forbidden. Ich schätze, wenn Sie es einschalten, funktioniert es normal. Von dem, was ich von den Dokumenten verstehe, ist es nicht sehr gut, DirectorySlash für die Sicherheit zu deaktivieren. http://httpd.apache.org/docs/2.1/mod/mod_dir.html

+0

Laurent, danke für deine Antwort. Ich habe die ** Sicherheitswarnung ** in den Apache-Dokumenten gelesen, aber ich muss verstehen, was hier schief gelaufen ist. Übrigens ist die Verzeichnisliste standardmäßig in meinem Webhost-Backend deaktiviert. – gearsdigital

+0

Sie 'rewriteBase ist/ordner /', so dass Sie den Endslash auf der URL benötigen, damit sie übereinstimmen. Sie können es auf '/ Ordner' setzen und ich denke es sollte ohne den End-Schrägstrich funktionieren. – laurent

+0

Ich bekomme auch eine 403, wenn ich Ihrem Vorschlag folge. – gearsdigital

8

Mit Apache 2.4 können Sie das Überschreiben in .htaccess-Dateien zulassen, indem Sie RewriteOptions AllowNoSlash einstellen.

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>] 
... 

Siehe Apache documentation of mod_rewrite