Nginx反向代理修改Request的HOST字段为什么会影响到sub filter替换Response的内容

发布于 2022-09-07 08:03:54 字数 1812 浏览 14 评论 0

1.尝试用Nginx反向代理公网上的网站cnki.net,并使用HttpSubstitution模块改写Response内容。当我配置proxy_set_header Host $host:$server_port 时,能够成功改写Response的内容;当我配置proxy_set_header Host cnki.net 时,改写不生效。我的疑问是,proxy_set_header Host改写的是Request的内容,为什么会影响我修改Response呢?

配置文件cnki.conf:

server {
   listen 8080;
   server_name zhongxiaocnki.net;
   include enable_ssl.conf;

   include cnki.net/rules/server-variable.conf;

### log files ###
   access_log logs/access.log;
   error_log logs/error.log debug;


   location / {
   proxy_pass http://www.cnki.net;                                      #这个一定要是https
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   proxy_set_header Host $host:$server_port;
   #proxy_set_header Host www.cnki.net;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto https;

   include cnki.net/rules/url_rewrite_rule.conf;
   include cnki.net/rules/redirect.conf;

}
}

配置文件url_rewrite_rule.conf:

sub_filter_once off;
sub_filter_types *;
sub_filter 'http://'  '$prtc://';
sub_filter 'www.cnki.net'  '$host:8080';
sub_filter 'piccache.cnki.net'  '$host:8081';
sub_filter 'kns.cnki.net'  '$host:8082';
sub_filter 'my.cnki.net'  '$host:8083';
sub_filter 'm.cnki.net'  '$host:8084';
sub_filter 'r.cnki.net'  '$host:8091';
sub_filter 'search.cnki.net'  '$host:8106';

当proxy_set_header Host $host:$server_port时的访问效果:

clipboard.png

当proxy_set_header Host www.cnki.net时的访问效果:

clipboard.png

问题:修改Request的HOST字段为什么会影响到sub filter替换Response的内容?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泛滥成性 2022-09-14 08:03:54

知道原因了,跟我修改Request的HOST字段没有直接关系,问题在gzip上。

当我设置HOST为代理服务器自身时,cnki.net服务器返回Response时不会使用gzip压缩,请求头和返回头如下:

clipboard.png

当我设置HOST为www.cnki.net时,cnki.net服务器返回Response时采用gzip压缩内容,请求头和返回头如下:

clipboard.png

因为内容被gzip压缩过,因此无法按照预期的规则来替换。只需要在配置中加上:

proxy_set_header Accept-Encoding "";

通过这样的方式禁用gzip后,sub filter工作就正常了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文