2013-03-19 10 views
5

Dies scheint lächerlich, aber ich habe keine funktionierende Antwort in über einer Stunde Suche gefunden.nginx statische index redirect

Ich habe eine statische Website läuft nginx (die zufällig hinter Varnish). Die Indexdatei heißt index.html. Ich möchte jeden umadressieren, der die URL mydomain.com/index.html zurück zu mydomain.com besucht.

Hier ist meine nginx Konfiguration für den Standort:

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 als http://www.mydomain.com/ mit einem 301 mit der Lage zu erwarten, aber leider http://www.mydomain.com/ dient auch eine 301 zurück zu sich selbst, so erhalten wir eine Umleitung Schleife.

Wie kann ich Nginx sagen, nur die 301 zu dienen, wenn index.html buchstäblich in der Anfrage ist?

Antwort

7

Fügen Sie einen neuen Standortblock für Ihre Homepage hinzu und verwenden Sie die Direktive try_files (anstelle von "index index.html"), um direkt nach der Datei index.html zu suchen. Beachten Sie, dass Sie in try_files mindestens zwei Optionen eingeben müssen. Also lege ich die gleiche Datei zweimal ab.

location =/{ 
    root /usr/share/nginx/www.mydomain.com/public; 
    try_files /index.html /index.html; 
} 

Sieht gut aus, basierend auf meinem Experiment:

curl -iL http://www.mydomain.com/index.html 
HTTP/1.1 301 Moved Permanently 
Server: nginx 
Date: Sat, 16 Mar 2013 09:07:27 GMT 
Content-Type: text/html 
Content-Length: 178 
Connection: keep-alive 
Location: http://www.mydomain.com/ 

HTTP/1.1 200 OK 
Server: nginx 
Date: Sat, 16 Mar 2013 09:07:27 GMT 
Content-Type: text/html 
Content-Length: 4 
Last-Modified: Sat, 16 Mar 2013 08:05:47 GMT 
Connection: keep-alive 
Accept-Ranges: bytes 

[UPDATE] Die Hauptursache für die Umleitung Schleife ist die Richtlinie 'Index', der nginx löst eine weitere Runde der Lage zu tun wieder übereinstimmen. Auf diese Weise wird die Rewrite-Regel außerhalb des Standortblocks erneut ausgeführt, wodurch die Schleife verursacht wird. Also ist die 'index'-Direktive wie eine "Neuschreiben ... letzte;" Richtlinie. Das willst du in deinem Fall nicht.

Der Trick besteht darin, keine weitere Standortübereinstimmung erneut auszulösen. try_files können das effizient machen. Deshalb habe ich es in meiner ursprünglichen Antwort ausgewählt. Allerdings, wenn Sie möchten, ist eine weitere einfache Lösung

index index.html; 

von

rewrite ^/$ /index.html break; 

in Ihrem ursprünglichen "Standort /" Block zu ersetzen. Dieses "umschreiben ... brechen;" Anweisung behält Nginx innerhalb des gleichen Standortblocks, stoppt effektiv die Schleife. Der Nebeneffekt dieses Ansatzes besteht jedoch darin, dass Sie die Funktionalität der index-Direktive verlieren.

[UPDATE 2]

Tatsächlich führt Index Richtlinie nach Richtlinie Rewrite. Also funktioniert das Folgende auch. Beachten Sie, dass ich gerade den Neueintrag hinzugefügt habe ... break; Linie. Wenn die Anfrage-URL "/" ist, findet nginx die vorhandene Datei /index.html zuerst aus der Rewrite-Regel. Daher wird die Index-Direktive für diese Anfrage niemals ausgelöst. Dadurch können beide Richtlinien zusammenarbeiten.

location/{ 
    root /usr/share/nginx/www.mydomain.com/public; 
    index index.html; 
    rewrite ^/$ /index.html break; 
    } 
+0

Danke, das funktioniert. Ich verstehe nicht wirklich, warum das die Umleitungsschleife stoppt, aber das tut es. 'try_files' ist vielleicht ein bisschen magisch. Können Sie erklären, warum die Zeile "try_files/index.html /index.html;" in den _existing_ location block nicht funktioniert? (Ich habe das versucht). Prost. – Ade

+0

Da @ Chuan-Ma Ihr Problem gelöst hat, vergessen Sie nicht, seine Antwort als akzeptiert zu markieren :) –

+0

@Ade Ich werde später heute Abend erklären. –

-1

Sieht aus wie Sie wirklich wollen nicht index.php in der Adressleiste angezeigt werden, ist das richtig?

Wenn Sie der nginx-Konfiguration eine rewrite-Anweisung hinzufügen, erhalten Sie, wie Sie erfahren haben, eine Redirect-Schleife. Wenn Sie zu einer Javascript-Lösung offen sind, können Sie diese überall Platz in Ihrem index.html leise die Adressleiste neu zu schreiben:

<script> 
    history.pushState(null, '', '/'); 
</script> 

For more information

Beachten Sie, dass die meisten modernen Browser unterstützen die history API, nicht alle tun (nämlich die meisten Versionen von IE).

+0

Danke; Ja, ich kenne mehrere Möglichkeiten der Umleitung auf Anwendungsebene, wollte dies aber auf Serverebene konfigurieren, da es für eine Reihe von Anwendungen wiederverwendet werden soll. – Ade

Verwandte Themen