nginx: wyślij wszystkie żądania do jednej strony HTML

156

Korzystając z nginx, chcę zachować adres URL, ale w rzeczywistości ładuję tę samą stronę bez względu na wszystko. Będę używać adresu URL z History.getState()do kierowania żądań w mojej aplikacji javascript. Wygląda na to, że powinno to być proste?

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

działa, ale przekierowuje adres URL? Nadal potrzebuję adresu URL, po prostu chcę zawsze używać tej samej strony.

pryzmat wszystkiego
źródło
6
Dzięki za zadanie tego pytania, więc odpowiedź była dla mnie gotowa :-)
Lasse Bunk

Odpowiedzi:

191

Myślę, że to zrobi to za Ciebie:

location / {
    try_files /base.html =404;
}
Alex Howansky
źródło
1
[emerg] 613 # 0: nieprawidłowa liczba argumentów w dyrektywie "try_files"?
prismofeverything
2
Ok, spróbuj tego: try_files $ uri /base.html;
Alex Howansky
5
Uwaga - to najpierw sprawdzi żądany plik, a jeśli go tam nie ma, wyświetli base.html. Upewnij się więc, że nie masz żadnych starych dodatkowych plików w katalogu głównym dokumentu, w przeciwnym razie zostaną one udostępnione bezpośrednio, jeśli zostaną zapytane.
Alex Howansky
22
Użycie try_files '' /base.html;(pustego ciągu jako pierwszego argumentu do try_files) pozwala uniknąć przeszukiwania pliku o nazwie $uri.
davidjb
17
try_files '' /base.html;dał mi problem z przekierowaniem i wewnętrzny błąd serwera, ale zmodyfikowałem go, aby to try_files '' /base.html =404;naprawić, jeśli komuś to pomoże.
William Turrell
30

Używanie po prostu try_filesnie działało dla mnie - spowodowało przepisanie lub wewnętrzny błąd cyklu przekierowania w moich dziennikach.

Dokumentacja Nginx zawierała dodatkowe szczegóły:

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

Skończyło się na tym, że użyłem:

root /var/www/mysite;

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

location = /base.html {
    expires 30s;
}
Kevan Stannard
źródło
1
try_files '' /base.html =404;(patrz wyżej)
Marc
To działało dla mnie, ale właściwie nie potrzebowałem tej location = /base.html { expires 30s }roli.
maechler
17

Twoje oryginalne przepisanie powinno prawie działać. Nie jestem pewien, dlaczego miałoby to być przekierowanie, ale myślę, że tak naprawdę chcesz po prostu

rewrite ^ /base.html break;

Powinieneś móc to umieścić w lokalizacji lub bezpośrednio na serwerze.

kolbyjack
źródło
13

To zadziałało dla mnie:

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

Pozwoliło mi to utworzyć adres URL typu catch-all dla aplikacji jednostronicowej javascript. Wszystkie pliki statyczne, takie jak css, czcionki i javascript utworzone przez program, npm run build zostaną znalezione, jeśli znajdują się w tym samym katalogu co index.html.

Gdyby z jakiegoś powodu pliki statyczne znajdowały się w innym katalogu, potrzebowałbyś również czegoś takiego:

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

To zadziałało dla mnie:

location / {
    try_files $uri $uri/ /base.html;
}
Abhishek
źródło
7

Właściwy sposób to:

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

Użycie lastspowoduje, że nginx znajdzie nowy odpowiedni locationblok zgodnie z wynikiem przepisywania.

try_files jest również doskonale uzasadnionym podejściem do tego problemu.

Etherealone
źródło