Правило перезаписи NGINX применяется дважды
Я хочу настроить NGINX для обслуживания приложений OpenUI5 на компьютере разработчика. Я никогда не использовал NGINX раньше, и у меня возникают проблемы с переписыванием URL.
Как видно из журнала трассировки, он применяется дважды, и поэтому запрос приводит к ошибке 404.
"^/(?<name>[^/]+)(/(?<something>.*)|/?)$" matches "/HelloWorld/"
rewritten data: "/HelloWorld/WebContent/"
"^/(?<name>[^/]+)(/(?<something>.*)|/?)$" matches "/HelloWorld/WebContent/index.html"
rewritten data: "/HelloWorld/WebContent/WebContent/index.html"
Вот кусочек моего конфига NGINX:
location / {
root projects;
index index.html index.htm;
rewrite ^/(?<name>[^/]+)(/(?<something>.*)|/?)$ /$name/WebContent/$something break;
}
location ~ ^/([^/]+)/resources/(.*)$ {
resolver 8.8.8.8;
add_header Access-Control-Allow-Origin "*";
proxy_pass https://openui5.hana.ondemand.com/1.34.9/resources/$2;
proxy_redirect off;
access_log on;
}
Позвольте мне уточнить задачу, которую я пытаюсь решить. В основном проект выглядит так:
+ nginx_root
|-+ projects
|-+ HelloWorld
|-+ WebContent
|-- index.html
|-+ main
|-- main.view.xml
|-- main.controller.js
Есть три требования, чтобы сделать это HelloWorld Работа:
Мы должны спрятаться
WebContentпапка, т.е. сделать ее содержимое доступным из http://localhost/HelloWorld а не http://localhost/HelloWorld/WebContentКаждый XHR из приложения должен отображаться в соответствии с 1-м требованием. Например, если приложение требует http://localhost/HelloWorld/main/main.view.xml, NGINX должен обслуживать его с
HelloWorld/WebContentПриложение пытается загрузить библиотеку OpenUI5 из
./resourcesпапка, то есть http://localhost/HelloWorld/resources/sap-ui-core.js`. Сама библиотека должна быть доставлена из CDN: https://openui5.hana.ondemand.com/1.34.9/resources/
Пожалуйста, извините за мой английский и дайте знать, могу ли я уточнить вопрос. Спасибо!
1 ответ
Это мое решение, основанное на том, что я понимаю из вашего вопроса.
Прежде всего, вы должны иметь root определяется за пределами вашего location блоки, так как nginx ведет себя несколько не интуитивно, когда root определяется там.
Затем location блок для решения пунктов 1 и 2:
location ~ ^/(<?project>[^/]+)/(<?folder>.*) {
alias /path/to/nginx_root/$project/WebContent/$folder;
}
Здесь мы фиксируем название проекта и путь внутри проекта к $project а также $folder переменные, а затем используйте эти переменные для построения реального пути внутри файловой системы, в которой существуют файлы для этого конкретного проекта, и сообщите nginx, что нужно извлекать файлы из этого пути, используя alias директивы.
Затем, для пункта 3, я предлагаю вам создать функцию внутри вашего приложения, где вы можете напрямую создавать URL-адреса, которые указывают на ваш CDN. Вы пропустите множество преимуществ CDN, если будете указывать URL-адреса на свой существующий веб-сервер, а затем перенаправлять запросы на CDN.
Еще хуже proxy_pass Вы использовали в своем решении. В этом случае делается запрос на ваш сервер nginx, который затем запрашивает ресурс у CDN, а затем отправляет ресурс пользователю.