2015-06-02 3 views
10

Ich benutze HAProxy Anhören auf 80, um Anfragen an einen Knoten-Server (Port: 3000) oder PHP-Server (4000) zu senden; Ich habe auch CSF installiert, die Ports 3000 und 80 zur Verfügung haben.Wie zu 404 umgeleitet wird, wenn URL auf einen vorhandenen Ordner verweist (kein abschließender Schrägstrich). HAproxy oder mod-rewrite related

Es funktioniert in Ordnung, wenn ich eine Seite auf http://example.com/forum/1/page.php, nach aber manchmal, wenn ich versehentlich example.com/forum/1 (ohne Schrägstrich) eingeben, hält es Laden und führt schließlich zu einer Fehlerseite ERR_CONNECTION_TIMED_OUT. Die Adressleiste zeigt an, dass sie an http://example.com:4000/forum/1/ umgeleitet wurde.

Da ich den 4000 Port nicht geöffnet habe, wenn ich mehrmals auf example.com/forum/1 gehe, würde es eine Blockierung durch CSF auslösen. Meine Frage ist, kann ich alle Anfragen umleiten, die auf einen tatsächlichen Ordner example.com/forum/1 (kein abschließender Schrägstrich) zu einer 404 Seite verweisen? Ich habe versucht, eine Rewrite-Regel hinzuzufügen, um jeder Anfrage einen Schrägstrich hinzuzufügen, aber das würde alle meine relativen Pfade durchbrechen (siehe mein Problem bei dieser post).

Also was ich wissen will ist, warum wurde ich umgeleitet http://example.com:4000/forum/1/ von http://example.com/forum/1? Wurde es von HAproxy verursacht?

Einig HAProxy config:

frontend all 0.0.0.0:80 
    timeout client 1h 
    # use apache2 as default webserver for incoming traffic 
    default_backend apache2 

backend apache2 
    balance roundrobin 

    option forwardfor 
    server apache2 myIpAddress:4000 weight 1 maxconn 1024 check 

    # server must be contacted within 5 seconds 
    timeout connect 5s 
    # all headers must arrive within 3 seconds 
    timeout http-request 3s 
    # server must respond within 25 seconds. should equal client timeout 
    timeout server 25s 

Hier sind meine Rewrite-Regeln:

RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule^- [L] 

RewriteCond %{REQUEST_URI} !^.*\.(jpg|css|js|gif|png)$ [NC] 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L] 

RewriteCond %{THE_REQUEST} /index\.php [NC] 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 

Antwort

3

Da /forum/1 ein gültiges physikalisches Verzeichnis, das Sie /forum/1/ weitergeleitet aufgrund dieser Einstellung:

DirectorySlash On 

, die von einem Modul namensverwendet wirdfügt nach Verzeichnissen einen abschließenden Schrägstrich hinzu, wenn es fehlt.

Sie können natürlich dieses Flag deaktivieren, indem Sie mit:

DirectorySlash Off 

aber be aware of security implications.

mehr sichern Sie auch benötigen:

Options -Indexes 

Verzeichnisliste auszuschalten.

Sicherheitswarnung (aus verknüpften Handbuch kopiert)

die abschließenden Schrägstrich Umleitung ausschalten kann in einer Offenlegung von Informationen führen. Stellen Sie sich eine Situation vor, in der mod_autoindex aktiv ist (Options +Indexes) und DirectoryIndex auf eine gültige Ressource (z. B. index.html) festgelegt ist und für diese URL kein anderer spezieller Handler definiert ist. In diesem Fall würde eine Anfrage mit einem Schrägstrich die Datei index.html anzeigen. Aber eine Anfrage ohne nachgestellten Schrägstrich listet den Verzeichnisinhalt auf.


Update: diesen Teil der Frage zu beantworten:

Meine Frage ist, kann ich alle Anforderungen umleiten, die example.com/forum/1 (kein Schrägstrich) zu einem tatsächlichen Ordner verweisen auf eine 404 Seite?

Sie können diesen Code in /forum/1/.htaccess verwenden:

DirectorySlash On 
RewriteEngine On 

RewriteRule ^$ - [L,R=404] 

Dies wird ein Schrägstrich zwingen, so dass Rewrite-Regel 404-Fehler senden verwendet werden.

+0

Haben Sie in dieser Antwort etwas falsch gefunden? – anubhava

2

Fügen Sie in Ihrer .htaccess-Datei den folgenden Code hinzu. Ersetzen Sie /404.php durch eine beliebige Datei.

ErrorDocument 404 /404.php 
1

an der Spitze der .htaccess Setzen Sie dieses

DirectorySlash Off 
RewriteOptions AllowNoSlash 
RewriteEngine On 
RewriteCond ${REQUEST_FILENAME} -d 
RewriteRule ^(.*[^/])$ - [L,R=404] 

DirectorySlash Off werden Verzeichnisse zugänglich ohne Schrägstrich ohne Umleitung machen.

Aber das Problem ist nicht-Schrägstrich-Version wird einfach den Inhalt des Verzeichnisses auflisten. Um dies zu vermeiden, wird RewriteOptions AllownoSlash hinzugefügt.

Jetzt, wenn der Ordner ohne Schrägstrich angefordert wird, wird 404 Fehler ausgelöst.

Verwandte Themen