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.


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;
}

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;
}

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.


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/;
}

10

Das hat bei mir funktioniert:

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.