2015-06-02 22 views
10

Sto utilizzando HAProxy in ascolto su 80 per inviare richieste a un server nodo (porta: 3000) o server php (4000); Ho anche installato CSF ​​che dispone di porte 3000 e 80 disponibili.Come reindirizzare a 404 quando url punta a una cartella esistente (nessuna barra finale). HAproxy o mod-rewrite related

Funziona bene quando passo in rassegna una pagina alla http://example.com/forum/1/page.php, ma a volte quando ho accidentalmente entro example.com/forum/1 (senza barra finale), mantiene il carico e alla fine porta ad una pagina di errore ERR_CONNECTION_TIMED_OUT. La barra degli indirizzi mostra che è stato reindirizzato a http://example.com:4000/forum/1/.

Poiché non ho la porta 4000 aperta, quando continuo a passare a example.com/forum/1 più volte, si innescherebbe un blocco tramite CSF. La mia domanda è, posso reindirizzare tutte le richieste che puntano a una cartella effettiva example.com/forum/1 (nessuna barra finale) su una pagina 404? Ho provato ad aggiungere una regola di riscrittura per aggiungere una barra finale ad ogni richiesta, ma ciò interromperà tutti i miei percorsi relativi (vedi il mio problema in questo post).

Quindi, quello che voglio sapere è, perché sono stato reindirizzato a http://example.com:4000/forum/1/ da http://example.com/forum/1? È stato causato da HAproxy?

Alcuni config HAproxy:

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 

Ecco le mie regole di riscrittura:

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] 

risposta

3

Dal /forum/1 è una directory fisica valida si ottiene reindirizzato a /forum/1/ a causa di questa impostazione:

DirectorySlash On 

utilizzato da un modulo chiamato mod_dir che aggiunge una barra finale dopo le directory, se manca.

Ovviamente si può trasformare questo flag off utilizzando:

DirectorySlash Off 

ma be aware of security implications.

Per essere più sicuro è inoltre necessario:

Options -Indexes 

per disattivare elenco di directory.

Avviso di protezione (copiato da manuale linked)

Spegnimento della barra di reindirizzamento finale può causare la divulgazione di informazioni. Considerare una situazione in cui è attivo mod_autoindex (Options +Indexes) e DirectoryIndex è impostato su una risorsa valida (ad esempio, index.html) e non esiste un altro gestore speciale definito per tale URL. In questo caso, una richiesta con una barra finale mostrerà il file index.html. Ma una richiesta senza barra finale elencerebbe il contenuto della directory.


Aggiornamento: Per rispondere a questa parte della domanda:

La mia domanda è, posso reindirizzare tutte le richieste che puntano a una cartella reale example.com/forum/1 (senza slash) per una pagina 404?

È possibile utilizzare questo codice in /forum/1/.htaccess:

DirectorySlash On 
RewriteEngine On 

RewriteRule ^$ - [L,R=404] 

Questo forzerà una barra finale in modo che regola di riscrittura può utilizzato per inviare 404 errore.

+0

Hai trovato qualcosa di sbagliato in questa risposta? – anubhava

2

Nel file .htaccess aggiungere il seguente codice. Sostituisci /404.php con qualsiasi file tu voglia.

ErrorDocument 404 /404.php 
1

mettere questo nella parte superiore del vostro .htaccess

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

DirectorySlash Off farà directory accessibile senza-slash senza redirect.

Ma il problema è che la versione non slash sarà sufficiente elencare il contenuto della directory. Per evitare questo, è stato aggiunto RewriteOptions AllownoSlash.

Ora quando viene richiesta la cartella senza una barra, viene generato l'errore 404.

Problemi correlati