NGINX rewrite rule applied twice

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:

  1. We should hide WebContent folder, i.e. make its contents available from http://localhost/HelloWorld and not http://localhost/HelloWorld/WebContent

  2. 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

  3. 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!

0
задан 17 March 2016 в 16:50
1 ответ

Это мое решение, основанное на том, что я понял из Вашего вопроса.

Прежде всего, Вам следует определить Ваш корень за пределами блоков Вашего расположения , так как 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, а затем отправляет ресурс пользователю.

.
1
ответ дан 4 December 2019 в 16:39

Теги

Похожие вопросы