NGINX 重写规则应用两次

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

  1. 我们应该隐藏WebContent文件夹,即使其内容可从http://localhost/HelloWorld并不是 http://localhost/HelloWorld/WebContent

  2. 应用程序中的每个 XHR 都应根据第一个要求进行映射。例如,如果应用程序需要 http://localhost/HelloWorld/main/main.view.xml,NGINX 应该从HelloWorld/WebContent

  3. 应用程序尝试从文件夹加载 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 请求资源,然后将资源发送给用户。

相关内容