Реагируйте на роутер с помощью nginx - PullRequest
1 голос
/ 04 июля 2019

У меня проблемы с настройкой nginx с реагирующим маршрутизатором. Я перепробовал все предложенные мной решения, но ни одно из них не соответствует моему варианту использования.

Это структура в моей файловой системе, обслуживаемая nginx

/path/to/my/app
|- v1.0/index.html
`- v2.0/index.html

Я развернул несколько версий в своем приложении, каждая из которых является отдельным приложением реакции.

Тогда есть еще одна вещь, чтобы завершить загадку. Мое приложение реагирует не на корневой URL домена (например, example.com/v1.0), а на example.com/my-app/v1.0.

Итак, я настроил nginx следующим образом

server {
  location ~ /my-app/([^/]+) { # capture version
    set $version $1; 
    root /path/to/my/app/$version  # directory where index.html is stored
    try_files $uri $uri/ /index.html
  }
}

Доступ к example.com/my-app/v1.0 работает нормально, но если путь содержит маршрут в реакции (example.com/my-app/v1.0/users), nginx возвращает 404, потому что он хочет обработать файл /path/to/my/app/v1.0/users, который явно отсутствует.

Также стоит упомянуть, что мое приложение работает только при доступе как example.com/my-app/v1.0/, а не example.com/my-app/v1.0/index.html. В последнем не настроен какой-либо маршрут.

1 Ответ

1 голос
/ 04 июля 2019

Один из вариантов - использовать alias с префиксом location, например:

location /my-app/ {
    alias /path/to/my/app/;
    if (-e $request_filename) { 
        rewrite ^(/my-app/[^/]+) $1/index.html last; 
    }
}

Значения директив location и alias должнызаканчивается / или не заканчивается /.Избегайте try_files и alias из-за этой проблемы .См. это предупреждение об использовании if.


Другой вариант - ваш подход, но замена терминов try_files правильными значениями.Например:

location ~ /my-app/(?<version>[^/]+)(?<suffix>/.*)?$ {
    root /path/to/my/app/$version;
    try_files $suffix $suffix/ /my-app/$version/index.html;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...