Apache2 - 301 Przekieruj, gdy brakuje „/” na końcu katalogu w adresie URL

13

Tak naprawdę nie zauważyłem tego przekierowania (301), gdy żądam takiego adresu URL bez ukośnika („/”) na końcu: http://server/directory

Serwer zareaguje za pomocą stałego nagłówka przekierowania 301 z lokalizacją nagłówka lokalizacji http://server/directory/.

Zobacz ten przykład na żywo:

Żądanie użytkownika:

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

Odpowiedź serwera Apache:

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

Żądanie użytkownika:

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

Odpowiedź serwera 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"

Katalog / social / zawiera index.htmlplik.

Oprogramowanie Apache: Apache/2.2.22 (Ubuntu)
Opcje katalogu:Options Indexes FollowSymLinks MultiViews

Moje pytanie brzmi: dlaczego apache to robi? A jak zapobiec przekierowaniu i wysłać index.htmlbezpośrednio? Klienci muszą wysłać dwa zapytania, co jest naprawdę niepotrzebne. Być może niektórzy klienci nie zezwalają na przekierowania i nie będą mogli przejść do witryny bez końcowego ukośnika („/”).

Nie chcę wyłączać przekierowania. Nie chcę, aby serwer wysyłał odpowiedź bezpośrednio bez żadnego przekierowania. Nawet na żądanie /social.

Czy apache służy do przekierowywania tych żądań? Serwer może po prostu wysłać dane bez przekierowywania, prawda? Czy powinienem użyć, mod_rewriteaby temu zapobiec? Lub inna konfiguracja? A może powinienem tak po prostu pozwolić i dodać ukośnik na końcu wszystkich linków HTML i żyć z pewnymi przekierowaniami?

Co myślicie?

Jonathan Gurebo
źródło
Myślę, że będziesz musiał wyjaśnić, dlaczego chcesz to wyłączyć. Jedyną rozsądną alternatywą dla przekierowania byłaby odpowiedź 404 dla /socialw twoim przykładzie.
Håkan Lindqvist
Nie chcę go wyłączać, po prostu zapobiegaj przekierowaniu. Chciałbym, aby serwer wyprowadził index.htmlbez przekierowania
Jonathan Gurebo
Przez „to” miałem na myśli normalne zachowanie z przekierowaniem z nieprawidłowego adresu URL na właściwy adres URL. Zobacz odpowiedź od @kasperd, aby poznać niektóre z powodów, dla których źle byłoby podawać zawartość np /social. (Ogólnie rzecz biorąc, zwykle nie jest pożądane podawanie tej samej treści pod wieloma adresami URL).
Håkan Lindqvist

Odpowiedzi:

10

Wysłanie danych bez przekierowania spowodowałoby uszkodzenie linków względnych. Jeśli http://server/directoryzawiera file, pełny adres URL to http://server/directory/file. Łącze określone podobnie <a href="file">wskazuje, http://server/directory/fileczy jest to podstawowy adres URL http://server/directory/, ale jeśli http://server/directorybyłby to tylko podstawowy adres URL , wskazywałby http://server/filezamiast tego, co nie jest zamierzonym wynikiem.

Apache mógł wygenerować listę katalogów na dwa różne sposoby w zależności od adresu URL zamiast przekierowywania. Nie działałoby to jednak, gdyby index.htmlw katalogu znajdował się plik. Zamiast tego Apache stosuje podejście, które działa w obu przypadkach.

To nie jest nowe zachowanie, dziesięć lat temu Apache zachowywał się w ten sam sposób. Klienci, którzy nie mogą obsłużyć przekierowania, powinni już zostać naprawieni. Ale dla wszystkich klientów, którzy nie są w stanie obsłużyć przekierowania, Apache powinien przesyłać niewielki plik HTML z linkiem, którego można użyć zamiast tego.

kasperd
źródło
To nie odpowiada na pytanie. To prawda, że ​​linki względne mogą zostać zerwane. Ale jeśli ktoś chce dostarczyć treść dla ścieżki bez końcowego ukośnika, może mieć na to powody, na przykład gdy żądanie POST jest wysyłane do usługi internetowej. W usługach internetowych nie ma żadnych linków względnych, a przekierowanie spowoduje utratę treści testu POST.
dr fu manchu
9

mod_dirdodaje to przekierowanie i można je wyłączyć za pomocą DirectorySlash Offdyrektywy.

Pamiętaj jednak, że wyłączenie przekierowania ukośnika końcowego może spowodować uszkodzenie niektórych stron. Jeśli zwracana strona zawiera linki względne, wówczas adresy URL rozwiązałyby się inaczej, gdyby strona była wyświetlana bez ukośnika końcowego.

200_sukces
źródło