nginx-static-index-redirect
Dies scheint lächerlich, aber ich habe nicht gefunden eine funktionierende Antwort in über einer Stunde Suche.
Habe ich eine statische website aus ausgeführt nginx (was passiert zu sein hinter-Lack). Die index-Datei aufgerufen wird index.html
. Ich umleiten möchten, wer eigentlich besucht die URL mydomain.com/index.html
zurück mydomain.com
.
Hier ist meine nginx config für die Website:
server {
listen 8080;
server_name www.mydomain.com;
port_in_redirect off;
location /{
root /usr/share/nginx/www.mydomain.com/public;
index index.html;
}
rewrite /index.html http://www.mydomain.com/permanent;
}
http://www.mydomain.com/index.html
reagiert wie erwartet mit 301
mit dem Standort http://www.mydomain.com/
aber leider http://www.mydomain.com/
dient auch ein 301 zurück zu sich selbst, so erhalten wir eine redirect-Schleife.
Wie kann ich feststellen, nginx, nur noch dazu dienen, 301, wenn index.html buchstäblich in der Anfrage?
InformationsquelleAutor Ade | 2013-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie eine neue Position zu blockieren, um Ihre homepage und nutzen try_files-Richtlinie (anstelle von "index index.html;") zu suchen, die index.html Datei direkt. Beachten Sie, dass try_files erfordert, dass Sie geben Sie mindestens 2 Möglichkeiten. So legte ich die gleiche Datei zweimal.
Sieht gut aus, basierend auf mein experiment:
[UPDATE]
Die Ursache des redirect-Schleife ist die 'index' - Richtlinie, die Trigger nginx zu tun, eine weitere Runde der Standort übereinstimmung wieder. Das ist, wie die rewrite-Regel außerhalb der location-block wird erneut ausgeführt, wodurch die Schleife. Also die 'index' - Direktive ist wie ein "umschreiben...die Letzte; - Richtlinie". Sie wollen nicht, dass in Ihrem Fall.
Der trick ist, nicht der Auslöser Standort übereinstimmung wieder. try_files kann das effizient tun. Das ist, warum ich habe es, in meiner ursprünglichen Antwort. Allerdings, wenn Sie möchten, eine andere einfache Lösung ist, ersetzen Sie
durch
in Ihrem ursprünglichen "Ort /" block. Dieses "umschreiben...break;" - Richtlinie halten nginx bleiben in der gleichen Position zu blockieren, effektiv stoppen der Schleife. Allerdings, der Nebeneffekt dieser Methode ist, dass Sie verlieren die Funktionalität von 'index' Richtlinie.
[UPDATE 2]
Eigentlich, index-Richtlinie wird ausgeführt, nachdem rewrite-Direktive. So auch die folgenden Werke. Beachten Sie, dass ich soeben das umschreiben...break; Linie. Wenn der request-uri ist "/", nginx findet die vorhandene Datei /index.html aus der rewrite-Regel zuerst. Also die index-Direktive wird nie ausgelöst werden, für diese Anfrage. Als Ergebnis, beide Richtlinien zusammen arbeiten können.
try_files
ist ein bisschen Magie vielleicht. Können Sie erklären, warum setzen dietry_files /index.html /index.html;
Zeile in der location-block funktioniert nicht? (Hab ich ausprobiert). Cheers.Da @chuan-ma dein problem gelöst, vergessen Sie nicht, markieren Sie seine Antwort als akzeptiert 🙂
Ich werde später erklären heute Abend.
fügen Sie mehr Erklärung. Nicht sicher, wie Sie es getan haben Ihren 2. test. Beachten Sie zum entfernen Ihrer 'index' - Direktive, damit es funktioniert.
Vielen Dank für die Erklärung - ich bin relativ neu in nginx und beginnen nun zu verstehen, es ein wenig besser. Danke!!!
InformationsquelleAutor Chuan Ma
Sieht aus wie Sie wirklich nicht wollen
index.php
zu zeigen, bis in der Adressleiste, ist das richtig?Wenn Sie fügen Sie eine Neufassung der Richtlinie für die nginx config, erhalten Sie eine redirect-Schleife, wie Sie Sie erlebt haben. Wenn Sie offen sind für eine javascript-Lösung, können Sie diese überall in Ihrem
index.html
lautlos schreiben Sie die Adressleiste:Für mehr Informationen
Beachten, dass, während die meisten modernen Browser unterstützen die
history
API, nicht alle tun (und zwar die meisten IE-Versionen).InformationsquelleAutor Julian H. Lam