С путями приложения на стороне клиента:
/
/foo
/foo/bar
/foo/bar/baz
/foo/bar/baz/123
/tacos
/tacos/123
Использование:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
gzip_static on;
location / {
try_files $uri $uri/ /index.html;
}
# Attempt to load static files, if not found route to @rootfiles
location ~ (.+)\.(html|json|txt|js|css|jpg|jpeg|gif|png|svg|ico|eot|otf|woff|woff2|ttf)$ {
try_files $uri @rootfiles;
}
# Check for app route "directories" in the request uri and strip "directories"
# from request, loading paths relative to root.
location @rootfiles {
rewrite ^/(?:foo/bar/baz|foo/bar|foo|tacos)/(.*) /$1 redirect;
}
}
Хотя @ ответ Адама-Уэйта работает для корня и путей на корневом уровне, использование if в контексте местоположения считается антипаттерном, часто встречающимся при преобразовании директив стиля Apache. Смотри: http://wiki.nginx.org/IfIsEvil.
Другие ответы не охватывают маршруты с глубиной каталогов для моего варианта использования в аналогичном приложении React, использующем реагирующий маршрутизатор и HTML5 pushState. Когда маршрут загружается или обновляется в «каталоге», таком как example.com/foo/bar/baz/213123
, мой файл index.html будет ссылаться на файл js по относительному пути и будет преобразован в example.com/foo/bar/baz/js/app.js
вместо example.com/js/app.js
.
Для случаев с глубиной каталогов за пределами первого уровня, например /foo/bar/baz
, обратите внимание на порядок каталогов, объявленных в директиве @rootfiles: сначала должны идти самые длинные пути, после чего следует следующий более мелкий путь /foo/bar
и наконец /foo
.