Могу ли я использовать # «фрагмент» часть URL-адреса в сопоставителе местоположений Nginx?

#nginx #webserver #nginx-config #nginx-location

#nginx #веб-сервер #nginx-config #nginx-location

Вопрос:

Я пытаюсь настроить блок местоположения, содержащий символ «#», для перенаправления на мой серверный сервер, содержащий приложение на основе AngularJS. Стратегия AngularJS HashLocationStrategy вводит правила маршрутизации на основе «#». Поэтому я, по сути, хочу, чтобы любой URL-адрес, начинающийся с «#», перенаправлялся на мой внутренний сервер, но маршрутизация Nginx не может этого сделать.

 ...
...
location ~ /#/app.*$ {
    # backend server routing
}

location / {
    # redirects to static website
}
...
...
 

Но это сопоставление местоположений не работает. Например: http://<hostname>/#/app должен перенаправлять на внутренний сервер, но в конечном итоге перенаправляет на index.html статический веб-сайт из-за сопоставления второго блока местоположения / .

Я также попытался настроить location блоки с сопоставителями, не содержащими символ «#» (т. Е. location ~ ^.*app.*$ {} ), Но это не сработало. Он по-прежнему перенаправляет на index.html

Есть ли способ настроить Nginx так, чтобы он учитывал первый блок местоположения, прежде чем просматривать второй.

Комментарии:

1. Часть URL-адреса с # начала (называемая фрагментом ) никогда не отправляется на сервер. Он используется браузером или клиентским JS-приложением.

2. @RichardSmith Большое спасибо за ответ. Это объясняет, почему я не смог получить маршрут Nginx на основе этой части. Я должен был посмотреть журнал доступа к Nginx и понять это. Но я этого не понял и неправильно пытался настроить правило на стороне сервера.

Ответ №1:

Нет, мы не можем настроить сопоставитель местоположений Nginx на основе fragment (т. Е. Начиная с # ), поскольку он никогда не отправляется на сервер. Благодаря разъяснению от @RichardSmith (см. Раздел Комментариев)

Часть URL-адреса, начиная с # и далее (называемая фрагментом), никогда не отправляется на сервер. Он используется браузером или клиентским JS-приложением — @RichardSmith

Таким образом, шаблон, который я пытался сопоставить в сопоставителе местоположений, никогда не будет работать, поскольку он никогда не достигает сервера.