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.


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

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

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.


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

10

To zadziałało dla mnie:

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.