Nginx代理中替换响应头与响应体主机地址的可行性咨询
Nginx代理中替换响应头与响应体主机地址的可行性咨询
当然可以实现!你已经掌握了在Nginx里替换请求Host头的方法,要同时把响应头和响应体里的myendpoint.net替换成myexample.com,咱们可以借助Nginx的几个内置模块来搞定,下面给你详细拆解:
一、先搞定响应头里的重定向地址(Location头)
如果后端返回的响应里包含Location: http://myendpoint.net/xxx这类重定向头,用Nginx自带的proxy_redirect就能直接替换,配置起来特别简单:
# 替换http和https的重定向地址 proxy_redirect http://myendpoint.net/ http://myexample.com/; proxy_redirect https://myendpoint.net/ https://myexample.com/;
这个指令专门用来修正后端返回的重定向地址,完全不需要额外模块,开箱即用。
二、替换响应体里的所有匹配字符串
要替换响应体里的myendpoint.net,用Nginx的sub_filter模块就够了(这个模块默认是编译进Nginx的,不用额外安装)。只需要在你的location块里加这几行:
# 匹配并替换目标字符串 sub_filter 'myendpoint.net' 'myexample.com'; # 注意:默认只替换第一个匹配项,加上这行才能替换所有 sub_filter_once off; # 指定要处理的内容类型,默认只有text/html,按需添加其他类型比如JSON、CSS等 sub_filter_types text/html application/json text/css text/javascript;
三、处理其他响应头里的字符串(可选)
如果除了Location头之外,还有其他响应头(比如Content-Security-Policy、X-Custom-Domain这类)包含myendpoint.net,这时候可能需要用到第三方模块ngx_http_headers_more_filter_module。比如要替换Content-Security-Policy里的地址:
more_set_headers -s 'Content-Security-Policy' 'script-src $scheme://myexample.com';
不过这个模块不是默认编译的,如果你用的是官方包,可能需要重新编译Nginx或者用带这个模块的发行版(比如OpenResty)。
整合后的完整配置
把这些配置加到你现有的location块里,最终效果是这样的:
server_name myexample.com; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host myendpoint.net; proxy_pass http://127.0.0.1:8111; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 替换重定向Location头 proxy_redirect http://myendpoint.net/ http://myexample.com/; proxy_redirect https://myendpoint.net/ https://myexample.com/; # 替换响应体中的所有匹配字符串 sub_filter 'myendpoint.net' 'myexample.com'; sub_filter_once off; sub_filter_types text/html application/json text/css text/javascript; # 如果后端返回压缩内容,需要先解压再替换(可选) gunzip on; }
小提示
- 如果你的后端返回的是gzip压缩过的响应,记得开启
gunzip on;,不然sub_filter没法处理压缩后的内容;或者也可以给后端发送proxy_set_header Accept-Encoding "";,让后端不返回压缩内容。 sub_filter是大小写敏感的,如果需要不区分大小写的替换,可能得借助Lua模块或者第三方的替换模块来实现。
备注:内容来源于stack exchange,提问作者Semyon Bayandin
相关产品推荐
相关产品推荐

