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;
}
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
Da @ Chuan-Ma Ihr Problem gelöst hat, vergessen Sie nicht, seine Antwort als akzeptiert zu markieren :) –
@Ade Ich werde später heute Abend erklären. –