nginx能否替换服务器发送的301重定向的内容

最近在学习使用Nginx的https反向代理,选择知网作为被代理的真实服务器来进行测试。

配置文件cnki.conf:

server {
   listen 8080;
   server_name *.zhongxiaocnki.net;
   include enable_ssl.conf;
###  log files ### 
   access_log logs/access.log; 
   error_log logs/error.log debug; 

   location / {
   proxy_pass http://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 X-Real-IP $remote_addr; 
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
   proxy_set_header X-Forwarded-Proto https; 
   proxy_redirect off; 
   
   include url_rewrite/*.conf; 
}
}

配置文件url_rewrite/*.conf:

set $prtc "https";

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

当访问https://zhongxiaotest.com:8080时代理cnki.net,并通过替换response里的url把一些子域名通过其他端口代理起来。

现在遇到两个问题:
1.页面上有些url指向的其实是一个目录,但是url最后没有加‘/’,这样导致在访问这个URL的时候,服务器会返回一个301重定向,重定向里有个Location字段给出了结尾为‘/’的新的url,但这个url是HTTP的:

clipboard.png
(这里我为了截包没有使用HTTPS,此时这个URL刚好是我代理的HTTP的8082端口,因此可以访问成功,如果我的代理监听HTTPS的8082,这个URL就无法访问了)

在网上搜了半天关于Nginx处理重定向的问题,大多都是教你nginx自己如何配置重定向的,如何修改服务器的重定向没找到。不过找到了另一个方法:监听HTTPS的同时也监听HTTP,然后在HTTP的Server块里把HTTP改写成HTTPS。但是我的场景里指定了端口是8082,一个端口不能同时被HTTP和HTTPS监听吧?

所以我想问,Nginx对服务器发过来的301重定向,是否可以修改其中的Location为自己想要的URL。如果可以,使用什么模块的什么指令?

2.有些重定向是在脚本里面做的,比如这个url:“https://zhongxiaotest.com:8083//kns/RedirectPage.aspx?action=usercenter”,点击时访问RedirectPage.aspx,动作为跳转到用户中心,这种脚本里的跳转又该如何处理?
求指教!

阅读 4.2k
1 个回答

proxy_redirect了解一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题