NGINX 反向代理未加载资源

Pen*_*der 6 ssl nginx proxy

我正在尝试在一些内部 Web 服务前放置一个反向代理。

Nginx 已设置并正常工作以服务请求。如果我只location /在我的 conf 文件中提供一个,它会成功加载该 proxy_pass 目标,即:

location / {
  proxy_pass https://internal.ip:port/;
 }
Run Code Online (Sandbox Code Playgroud)

浏览到https://public_proxy_address/可以完美地加载该内部资源。

但是,由于我有多个内部应用程序,我想通过 nginx 代理所有这些应用程序。因此,在我的测试中,我将 conf 更改为如下:

location /app1 {
  proxy_pass https://internal.ip:port/;
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我得到了主/默认内部应用程序索引页面,但视图源显示我没有重新编写链接样式表、js 或其他资源。因此页面的全部内容无法加载。在 Apache 中,我可能会编写一个proxyhtmlurlmap ^/resource/ /app1/resource R. 不过,我在 nginx 中找不到任何方法来实现这一点。

我也试过这个,无济于事:

location /app1 {
  rewrite /resource(.*?) /app1/resource$1 break;
  proxy_pass https://internal.ip:port/;
 }
Run Code Online (Sandbox Code Playgroud)

如何让 nginx 正确地将目标位置(app1)添加到请求的资源 URL 以便它们加载?

小智 6

由于我没有足够的信用,我无法对条目发表评论,因此,这里是我作为单独条目的回应。

我不知道为什么 OP 不同意,但我认为 Martin Fjordval 正确识别了问题并提出了正确的建议。不过,我建议对他的代码段稍作修改,如下所示;

                location /app1/ {
                    proxy_set_header Host $http_host/app1;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Scheme $scheme;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_redirect    off;
                    add_header Pragma "no-cache";
                    add_header Cache-Control "no-cache";

                    proxy_pass http://internal.ip:port/;
                    sub_filter 'action="/'  'action="/app1/';
                    sub_filter 'href="/'  'href="/app1/';
                    sub_filter 'src="/'  'src="/app1/';
                    sub_filter_once off;
            }
Run Code Online (Sandbox Code Playgroud)

因此,如果您确定所有以 '/' 开头的相对 url 都需要重定向,则上述内容会将 '/app1/' 附加到它们之后,并在引用时让它们被 'location /app1/' 块捕获。然后,您可以查看页面源并确认正在重写。

您可能还需要整个或至少部分 'proxy_set_header' shabang,尤其是 'proxy_set_header Host $http_host/app1' 位。


Tim*_*Tim 0

您在您的位置指定了单个绝对 URL,而不是页面的 URL 以及页面使用的所有资源。您需要指定以该 URL 开头的正则表达式。像这样的东西可能会起作用(我还没有测试过)

location ~ /app1(/.*) {
  proxy_pass https://internal.ip:port/;
}
Run Code Online (Sandbox Code Playgroud)