Apache2 - 301 Umleiten, wenn am Ende des Verzeichnisses in der URL "/" fehlt

13

Ich habe diese Weiterleitung (301) nicht wirklich bemerkt, als ich eine URL wie diese ohne Schrägstrich ("/") am Ende anforderte: http://server/directory

Der Server antwortet mit einem permanenten 301-Redirect-Header und einem Location-Header, der sich in befindet http://server/directory/.

Sehen Sie sich dieses Live-Beispiel an:

Benutzeranfrage:

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

Apache Server-Antwort:

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

Benutzeranfrage:

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

Apache Server-Antwort:

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"

Das Verzeichnis / social / enthält eine index.htmlDatei.

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

Meine Frage lautet also: Warum macht Apache das? Und wie kann man die Weiterleitung verhindern und index.htmldirekt versenden ? Kunden müssen zwei Anfragen senden, was wirklich unnötig ist. Und vielleicht erlauben einige der Clients keine Weiterleitungen und können die Site nicht ohne den abschließenden Schrägstrich ("/") aufrufen.

Ich möchte die Umleitung nicht deaktivieren. Ich möchte nicht, dass der Server die Antwort direkt ohne Weiterleitung sendet. Auch bei Aufforderung /social.

Ist Apache darauf ausgelegt, diese Anfragen umzuleiten? Der Server könnte die Daten einfach ohne Umleitung senden, oder? Soll ich die verwenden mod_rewrite, um dies zu verhindern? Oder eine andere Konfiguration? Oder sollte ich es einfach so lassen und am Ende aller HTML-Links einen Schrägstrich einfügen und mit einigen Weiterleitungen leben?

Was denkt ihr?

Jonathan Gurebo
quelle
Ich denke, Sie müssen klären, warum Sie dies deaktivieren möchten. Die einzig vernünftige Alternative zur Umleitung wäre, /socialin Ihrem Beispiel mit 404 zu antworten .
Håkan Lindqvist
Ich möchte es nicht deaktivieren, sondern nur die Weiterleitung verhindern. Ich möchte, dass der Server die index.htmlohne Weiterleitung
ausgibt
Mit "this" bezog ich mich auf das normale Verhalten mit einer Umleitung von der falschen URL zur richtigen URL. In der Antwort von @kasperd finden Sie einige Gründe, warum es eine schlechte Idee wäre, den Inhalt von z /social. (Außerdem ist es im Allgemeinen nicht erwünscht, denselben Inhalt an mehreren URLs bereitzustellen.)
Håkan Lindqvist,

Antworten:

10

Wenn Sie die Daten ohne Weiterleitung senden, werden relative Links unterbrochen. Wenn http://server/directoryenthält file, dann wäre die vollständige URL dafür http://server/directory/file. Ein wie angegebener Link <a href="file">zeigt an, http://server/directory/fileob die Basis-URL ist http://server/directory/, aber wenn die Basis-URL nur war http://server/directory, würde er http://server/filestattdessen auf zeigen, was nicht das beabsichtigte Ergebnis ist.

Apache könnte die Verzeichnisliste abhängig von der URL auf zwei verschiedene Arten generiert haben, anstatt sie umzuleiten. Dies würde jedoch nicht funktionieren, wenn sich eine index.htmlDatei im Verzeichnis befindet. Also verwendet Apache stattdessen den Ansatz, der in beiden Fällen funktioniert.

Dies ist kein neues Verhalten, vor einem Jahrzehnt verhielt sich Apache genauso. Clients, die eine Umleitung nicht verarbeiten können, sollten jetzt behoben sein. Aber für alle Clients, die keine Umleitung verarbeiten können, sollte Apache eine winzige HTML-Datei mit einem Link senden, dem stattdessen gefolgt werden kann.

Kasperd
quelle
Dies beantwortet die Frage nicht. Es ist richtig, dass relative Links beschädigt werden können. Wenn jemand jedoch Inhalte für einen Pfad ohne einen abschließenden Schrägstrich bereitstellen möchte, hat er möglicherweise entsprechende Gründe, z. B. wenn eine POST-Anforderung an einen Webservice gesendet wird. Es gibt keine relativen Links in Webservices und eine Umleitung führt dazu, dass der POST-Body verloren geht.
Dr. Fu Manchu
9

mod_dirFügt diese Umleitung hinzu und Sie können sie mit einer DirectorySlash OffDirektive deaktivieren .

Beachten Sie jedoch, dass das Deaktivieren der Umleitung mit abschließendem Schrägstrich dazu führen kann, dass einige Seiten beschädigt werden. Wenn die zurückgegebene Seite relative Links enthält, werden diese URLs anders aufgelöst, wenn die Seite ohne den abschließenden Schrägstrich geliefert wird.

200_erfolg
quelle