我正在尝试在一些内部 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' 位。
您在您的位置指定了单个绝对 URL,而不是页面的 URL 以及页面使用的所有资源。您需要指定以该 URL 开头的正则表达式。像这样的东西可能会起作用(我还没有测试过)
location ~ /app1(/.*) {
proxy_pass https://internal.ip:port/;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27834 次 |
| 最近记录: |