nginx: Alle Anfragen an eine einzelne HTML-Seite senden

156

Mit nginx möchte ich die URL beibehalten, aber tatsächlich dieselbe Seite laden, egal was passiert. Ich werde die URL mit verwenden History.getState(), um die Anfragen in meiner Javascript-App weiterzuleiten. Es scheint, als sollte es eine einfache Sache sein?

location / {
    rewrite (.*) base.html break;
}

funktioniert, aber leitet die URL um? Ich brauche immer noch die URL, ich möchte nur immer die gleiche Seite verwenden.

Prisma von allem
quelle
6
Danke, dass du diese Frage gestellt hast, damit die Antwort für mich bereit war :-)
Lasse Bunk

Antworten:

191

Ich denke, das wird es für Sie tun:

location / {
    try_files /base.html =404;
}
Alex Howansky
quelle
1
[emerg] 613 # 0: Ungültige Anzahl von Argumenten in der Direktive "try_files"?
Prisma von allem
2
Ok, versuchen Sie Folgendes: try_files $ uri /base.html;
Alex Howansky
5
Hinweis - Hiermit wird zuerst nach der angeforderten Datei gesucht. Wenn diese nicht vorhanden ist, wird base.html bereitgestellt. Stellen Sie also sicher, dass sich keine alten zusätzlichen Dateien in Ihrem Dokumentenstammverzeichnis befinden. Andernfalls werden sie bei einer Abfrage direkt bereitgestellt.
Alex Howansky
22
Durch die Verwendung von try_files '' /base.html;(leere Zeichenfolge als erstes Argument try_files) wird die Suche nach einer aufgerufenen Datei vermieden $uri.
Davidjb
17
try_files '' /base.html;gab mir ein Umleitungsproblem und einen internen Serverfehler, aber das Ändern, um das zu beheben try_files '' /base.html =404;, wenn es jemandem hilft.
William Turrell
30

Die Verwendung try_fileshat bei mir einfach nicht funktioniert - sie hat einen Fehler beim Umschreiben oder beim internen Umleitungszyklus in meinen Protokollen verursacht.

Die Nginx-Dokumente enthielten einige zusätzliche Details:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

Also habe ich folgendes verwendet:

root /var/www/mysite;

location / {
    try_files $uri /base.html;
}

location = /base.html {
    expires 30s;
}
Kevan Stannard
quelle
1
try_files '' /base.html =404;(siehe oben)
Marc
Das hat bei mir funktioniert, aber ich brauchte das location = /base.html { expires 30s }Teil eigentlich nicht .
Maechler
17

Ihr ursprüngliches Umschreiben sollte fast funktionieren. Ich bin nicht sicher, warum es umleiten würde, aber ich denke, was Sie wirklich wollen, ist gerecht

rewrite ^ /base.html break;

Sie sollten in der Lage sein, dies an einem Ort oder direkt auf dem Server abzulegen.

Kolbyjack
quelle
13

Das hat bei mir funktioniert:

location / {
    alias /path/to/my/indexfile/;
    try_files $uri /index.html;
}

Dadurch konnte ich eine Sammel-URL für eine einseitige Javascript-App erstellen. Alle statischen Dateien wie CSS, Schriftarten und Javascript, die von erstellt wurden npm run build , werden gefunden, wenn sie sich im selben Verzeichnis wie befinden index.html.

Wenn sich die statischen Dateien aus irgendeinem Grund in einem anderen Verzeichnis befinden, benötigen Sie außerdem Folgendes:

# Static pages generated by "npm run build"
location ~ ^/css/|^/fonts/|^/semantic/|^/static/ {
    alias /path/to/my/staticfiles/;
}
Mark Chackerian
quelle
10

Das hat bei mir funktioniert:

location / {
    try_files $uri $uri/ /base.html;
}
Abhishek
quelle
7

Der richtige Weg wäre:

location / {
    rewrite (.*) base.html last;
}

Mit lastwird Nginx einen neuen geeigneten locationBlock finden, der dem Ergebnis des Umschreibens entspricht.

try_files ist auch ein absolut gültiger Ansatz für dieses Problem.

Etherealone
quelle