I want to set up NGINX to serve OpenUI5 applications on development machine. I never used NGINX before, and experience troubles with rewriting URLs.
As I can see from trace log, it is applied twice, and thus request results in 404 error.
"^/(?<name>[^/]+)(/(?<something>.*)|/?)$" matches "/HelloWorld/"
rewritten data: "/HelloWorld/WebContent/"
"^/(?<name>[^/]+)(/(?<something>.*)|/?)$" matches "/HelloWorld/WebContent/index.html"
rewritten data: "/HelloWorld/WebContent/WebContent/index.html"
Here is a pice of my NGINX config:
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;
}
Let me clarify the task I'm trying to solve. Basically project looks like this:
+ nginx_root
|-+ projects
|-+ HelloWorld
|-+ WebContent
|-- index.html
|-+ main
|-- main.view.xml
|-- main.controller.js
There are three requirements to make this HelloWorld
work:
We should hide WebContent
folder, i.e. make its contents available
from http://localhost/HelloWorld and not
http://localhost/HelloWorld/WebContent
Each XHR from the application should be mapped according to 1st
requirement. For example, if application requires
http://localhost/HelloWorld/main/main.view.xml, NGINX should serve
it from HelloWorld/WebContent
Application attempts to load OpenUI5 library from ./resources
folder, i.e. http://localhost/HelloWorld/resources/sap-ui-core.js`.
The library itself should be delivered from CDN:
https://openui5.hana.ondemand.com/1.34.9/resources/
Please, excuse me for my English and let know if I could clarify the question. Thanks!
Это мое решение, основанное на том, что я понял из Вашего вопроса.
Прежде всего, Вам следует определить Ваш корень
за пределами блоков Вашего расположения
, так как nginx ведет себя несколько неинтуитивно, когда там определен корень
. Затем блок местоположение
для решения точек 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, а затем отправляет ресурс пользователю.