我想在开发机器上设置 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 都应根据第一个要求进行映射。例如,如果应用程序需要 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 点,我建议您在应用程序内部构建一个功能,您可以在其中直接构建指向 CDN 的 URL。如果您将 URL 指向现有的 Web 服务器,然后将请求重定向到 CDN,您将错过 CDN 的许多好处。
更糟糕的是proxy_pass
您在解决方案中使用的。在这种情况下,会向您的 nginx 服务器发出请求,然后该服务器会从 CDN 请求资源,然后将资源发送给用户。