nginx: отправлять все запросы на одну html-страницу

156

Используя nginx, я хочу сохранить URL, но на самом деле загрузить ту же страницу, несмотря ни на что. Я буду использовать URL History.getState()для маршрутизации запросов в моем приложении javascript. Кажется, это должно быть простым делом?

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

работает, но перенаправляет URL? Мне все еще нужен URL, я просто хочу всегда использовать одну и ту же страницу.

prismofeverything
источник
6
Спасибо, что задали этот вопрос, поэтому ответ был для меня готов :-)
Лассе Банк

Ответы:

191

Я думаю, что это сделает это для вас:

location / {
    try_files /base.html =404;
}
Алекс Хованский
источник
1
[emerg] 613 # 0: неверное количество аргументов в директиве try_files?
prismofeverything
2
Хорошо, попробуйте это: try_files $ uri /base.html;
Алекс Ховански
5
Обратите внимание - это сначала проверит запрошенный файл, и если его там нет, он будет обслуживать base.html. Поэтому убедитесь, что у вас нет старых лишних файлов в корневой директории вашего документа, иначе они будут обработаны напрямую при запросе.
Алекс Ховански
22
Использование try_files '' /base.html;(пустая строка в качестве первого аргумента try_files) позволяет избежать поиска файла с именем $uri.
Давиджб
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 }части.
Мехлер
17

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

rewrite ^ /base.html break;

Вы должны быть в состоянии поместить это в месте или непосредственно на сервере.

kolbyjack
источник
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/;
}
Марк Чакериан
источник
10

Это сработало для меня:

location / {
    try_files $uri $uri/ /base.html;
}
Абхишек
источник
7

Правильный путь будет:

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

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

try_files Это также совершенно правильный подход к этой проблеме.

Etherealone
источник