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.html
plik.
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.html
bezpoś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_rewrite
aby 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?
/social
w twoim przykładzie.index.html
bez przekierowania/social
. (Ogólnie rzecz biorąc, zwykle nie jest pożądane podawanie tej samej treści pod wieloma adresami URL).Odpowiedzi:
Wysłanie danych bez przekierowania spowodowałoby uszkodzenie linków względnych. Jeśli
http://server/directory
zawierafile
, pełny adres URL tohttp://server/directory/file
. Łącze określone podobnie<a href="file">
wskazuje,http://server/directory/file
czy jest to podstawowy adres URLhttp://server/directory/
, ale jeślihttp://server/directory
byłby to tylko podstawowy adres URL , wskazywałbyhttp://server/file
zamiast 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.html
w 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.
źródło
mod_dir
dodaje to przekierowanie i można je wyłączyć za pomocąDirectorySlash Off
dyrektywy.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.
źródło