【发布时间】:2015-11-24 08:08:42
【问题描述】:
我正在尝试设置反向代理以通过 http-ssl (https) 提供本地 http 服务。配置是这样设置的:
- 后端服务器监听 127.0.0.1:8081,因此只接收来自 localhost 的连接。它提供所有网页而无需 (!) 压缩。
- 前端服务器 (= nginx) 侦听端口 83 并提供从 127.0.0.1:8081 获取的数据
到目前为止,这在 nginx 中运行良好。不幸的是,后端服务器在其服务的网页中提供了一些绝对 URL,例如“http://127.0.0.1:8081/....”。而且这种行为不能(!)改变。因此,默认情况下,nginx 服务器按原样提供包含对 127.0.0.1 的无效引用的页面 - 从客户端的角度来看这是错误的。
使用 sub_filter 规则,所服务的网页应在网页内进行字符串替换。由于我无法修改后端服务器,因此 nginx 服务器应将 http://127.0.0.1 替换为更合适的 URL。但这行不通。事实上,似乎根本没有执行任何字符串替换。我尝试替换的任何字符串 - 交付给客户端的网页保持不变。
我的nginx配置是这样的:
server {
listen 83 default_server;
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8081;
sub_filter Test TEST;
sub_filter_once on;
sub_filter_types text/xml text/css text/javascript;
}
}
注意:在此配置中,我尝试将“Test”替换为“TEST”(但无济于事)。 “测试”是在后端 Web 服务器提供的网页中随机选择的字符串。我在这里用作测试对象。真正的替换应该是“http://127.0.0.1:8081/”到“/”之后,但即使是这个简单的测试也没有成功。
另一个注意事项:在最终配置中,nginx 服务器应该使用 https 提供数据。对于测试,上面测试和提供的配置不包括 SSL 配置。
nginx -V 告诉我 nginx 已经用相关模块 (--with-http_sub_module) 编译,所以一切都应该工作,不是吗?
我可能做错了什么,但不幸的是我无法弄清楚我在这里做错了什么。我什至在 stackoverflow 上找到了两个答案,即以下几个,但没有一个起作用:
- Any tool/utility to rewrite URLs in an html page
- http_sub_module / sub_filter of nginx and reverse proxy not working
你能帮忙吗?提前感谢您的回答。
【问题讨论】:
-
ngx_http_sub_module 模块是一个过滤器,它通过将一个指定的字符串替换为另一个来修改响应。你需要的是复习……打破;然后 proxy_pass nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_pass serverfault.com/questions/379675/…
-
根据您的解释,http_sub_module 应该完全符合我的预期:在交付前修改内容。但它没有:无论我提供什么样的 RegEx,内容都不会被修改。尽管如此,还是感谢您提到“重写”:在我的谷歌搜索中,我没有遇到任何类似的配置可能性。如果“重写”解决了这个问题,我会尽快尝试这个选项,然后提供反馈。
标签: nginx reverse-proxy