Apache2 - 301 Reindirizzare quando manca “/” alla fine della directory nell'URL


13

Non ho notato questo Redirect (301) quando ho richiesto un URL come questo senza barra ("/") alla fine: http://server/directory

Il server risponderà con un'intestazione permanente di reindirizzamento 301 con un'intestazione di posizione individuata in http://server/directory/.

Guarda questo esempio dal vivo:

Richiesta dell'utente:

GET /social HTTP/1.1
( http://192.168.1.111/social )

Risposta del server Apache:

HTTP/1.1 301 Moved Permanently
Location: http://192.168.1.111/social/

Richiesta dell'utente:

GET /social/ HTTP/1.1
( http://192.168.1.111/social/ )

Risposta del server Apache:

HTTP/1.1 200 OK

Apache access.log:

192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social HTTP/1.1" 301 558 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
-
192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social/ HTTP/1.1" 200 942 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"

La directory / social / contiene un index.htmlfile.

Software Apache: Apache/2.2.22 (Ubuntu)
Opzioni directory:Options Indexes FollowSymLinks MultiViews

Quindi, la mia domanda è: perché Apache sta facendo questo? E come impedire il reindirizzamento e inviare index.htmldirettamente il? I clienti devono inviare due richieste che non sono davvero necessarie. E forse alcuni client non consentono i reindirizzamenti e non saranno in grado di accedere al sito senza la barra finale ("/").

Non voglio disabilitare il reindirizzamento. Non voglio che il server invii la risposta direttamente senza reindirizzamento. Anche quando richiesto /social.

Apache è progettato per reindirizzare tali richieste? Il server potrebbe semplicemente inviare i dati senza reindirizzare, giusto? Dovrei usare il mod_rewriteper evitare questo? O un'altra configurazione? O dovrei semplicemente lasciare che sia così e aggiungere una barra alla fine di tutti i collegamenti HTML e vivere con alcuni reindirizzamenti?

Che cosa ne pensate?


Penso che dovresti chiarire perché vorresti disabilitare questo. L'unica alternativa sana al reindirizzamento sarebbe rispondere con 404 per /socialnel tuo esempio.
Håkan Lindqvist,

Non voglio disabilitarlo, basta impedire il reindirizzamento. Vorrei che il server index.html
eseguisse

Con "questo" mi riferivo al comportamento normale con un reindirizzamento dall'URL errato all'URL corretto. Vedi la risposta di @kasperd per alcuni dei motivi per cui sarebbe una cattiva idea pubblicare il contenuto ad es /social. (Inoltre, in generale, non è di solito necessario offrire lo stesso contenuto su più URL.)
Håkan Lindqvist

Risposte:


10

L'invio dei dati senza reindirizzamento interromperebbe i collegamenti relativi. Se http://server/directorycontiene file, allora l'URL completo sarebbe http://server/directory/file. Un collegamento specificato come <a href="file">punterà a http://server/directory/filese l'URL di base è http://server/directory/, ma se solo l'URL di base http://server/directorylo farebbe http://server/fileinvece, che non è il risultato previsto.

Apache avrebbe potuto generare l'elenco delle directory in due modi diversi a seconda dell'URL anziché reindirizzamento. Tuttavia, ciò non funzionerebbe se index.htmlnella directory fosse presente un file. Quindi invece Apache sta usando l'approccio, che funziona in entrambi i casi.

Questo non è un nuovo comportamento, un decennio fa Apache si comportava allo stesso modo. I client che non sono in grado di gestire un reindirizzamento dovrebbero essere già stati corretti. Ma per tutti i client che non sono in grado di gestire un reindirizzamento, Apache dovrebbe inviare un piccolo file html con un collegamento che può essere seguito invece.


Questo non risponde alla domanda. È corretto, i collegamenti relativi potrebbero essere interrotti. Ma se qualcuno vuole distribuire contenuti per un percorso senza una barra finale, potrebbe avere rendimenti per questo, ad esempio quando una richiesta POST viene inviata a un servizio web. Non ci sono collegamenti relativi nei servizi web e un reindirizzamento farà perdere il corpo POST.
dr fu manchu,

9

mod_diraggiunge questo reindirizzamento e puoi disabilitarlo con una DirectorySlash Offdirettiva.

Si noti, tuttavia, che la disabilitazione del reindirizzamento della barra finale potrebbe causare l'interruzione di alcune pagine. Se la pagina restituita contiene collegamenti relativi, tali URL si risolverebbero diversamente se la pagina viene pubblicata senza la barra finale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.