nginx: надсилайте всі запити на одну html-сторінку


156

Використовуючи nginx, я хочу зберегти URL-адресу, але фактично завантажувати ту саму сторінку незалежно від того. Я буду використовувати URL History.getState()для маршрутизації запитів у моєму додатку javascript. Здається, це слід зробити простою справою?

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

працює, але переспрямовує URL-адресу? Мені ще потрібна URL-адреса, я просто хочу завжди використовувати одну і ту ж сторінку.


6
Дякую, що задали це запитання, щоб відповідь була для мене готова :-)
Lasse Bunk

Відповіді:


191

Я думаю, що це зробить це за вас:

location / {
    try_files /base.html =404;
}

1
[emerg] 613 # 0: недійсна кількість аргументів у директиві "try_files"?
prіmofeverything

2
Гаразд, спробуйте це: try_files $ uri /base.html;
Олексій Хованський

5
Примітка - спочатку перевіряється потрібний файл, а якщо його немає, він буде обслуговувати base.html. Тому переконайтеся, що у вашому кореневому каталозі документа немає старих зайвих файлів, інакше вони будуть подані безпосередньо за запитом.
Олексій Хованський

22
Використання try_files '' /base.html;(порожній рядок як перший аргумент try_files) дозволяє уникнути пошуку файлу, який називається $uri.
davidjb

17
try_files '' /base.html;дав мені проблему з перенаправленням та внутрішню помилку сервера, але змінивши її на try_files '' /base.html =404;виправлену, якщо вона комусь допомагає.
Вільям Террелл

30

Використання просто try_filesне працювало для мене - це спричинило помилку циклу перезапису або внутрішнього перенаправлення в моїх журналах.

Документи Nginx мали деякі додаткові деталі:

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

Тож я закінчив використовувати наступне:

root /var/www/mysite;

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

location = /base.html {
    expires 30s;
}

1
try_files '' /base.html =404;(див. вище)
Марк

Це працювало для мене, але мені фактично не потрібна була location = /base.html { expires 30s }частина.
maechler

17

Ваша оригінальна переписка повинна майже працювати. Я не впевнений, чому це буде перенаправлення, але я думаю, що те, що ти насправді хочеш, - це просто

rewrite ^ /base.html break;

Ви повинні мати можливість розмістити це в місці чи безпосередньо на сервері.


13

Це працювало для мене:

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

Це дозволило мені створити загальну URL-адресу для односторінкового додатка javascript. Усі статичні файли, такі як css, шрифти та javascript, створені, npm run build будуть знайдені, якщо вони знаходяться в одному каталозі index.html.

Якщо статичні файли були з іншого каталогу, вам також знадобиться щось на зразок:

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


7

Правильним було б:

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

Використання lastзмусить nginx знайти новий відповідний locationблок відповідно до результатів переписування.

try_files також є цілком коректним підходом до цієї проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.