代理指定网站解决302、303状态码的网站修改response
优采云 发布时间: 2021-07-03 23:01代理指定网站解决302、303状态码的网站修改response
背景
我遇到了一个限制域名的平台,所以我用nginx做网站转发,其中目标网站在访问过程中使用了302、303的多个返回状态跳转到指定的目标(为什么限制是为了防止他网站的镜像)。
找了一条资料,发现nginx可以proxy网站,让它在自己的网站路径上访问。本文总共解决了以下两个要求:
代理访问指定路径时指定网站解析302、303状态码网站修改响应头,修改响应的web内容1.访问指定路径跳转到网站
使用proxy_pass指令实现,示例如下:
# 访问http://www.a.com/jump,就跳到指定路径http://www.b.com/jump ,配置如下
location ~* ^/jump$ {
proxy_pass http://www.b.com/jump;
}
2. 解决nginx直接返回302、303状态码的问题
代理目标网站时,目标网站使用了302状态码,这样nginx直接返回后,URL已经改变,不在网站的控制之下,所以会出现这个问题已解决:
使用proxy_redirect指令实现,示例如下:
# 访问http://www.a.com/jump,就跳到指定路径http://www.b.com/jump ,返回302,其中要跳转到www.c.com网站去,然后还是访问本地网站,配置如下
location ~* ^/jump$ {
proxy_pass http://www.b.com/jump;
proxy_redirect http://www.c.com/ /; #请求c网站映射到当前网站的/目录
}
以上代码流程: 访问时,nginx后台会访问获取返回的内容,状态码为302,如果不控制,浏览器会取出302中的位置直接访问,而位置是c网站的URL 有两种方式:一种是修改位置然后返回,另一种是proxy_redirect方法。
3.修改响应头
前两点是直接路径跳转。现在又要求修改302中位置的一些参数,那么proxy_redirect就没有办法了。这时候就需要用到ngx_lua模块了。该模块用于lua。语言控制了nginx的一些逻辑。
需要安装LuaJIT,并下载lua-nginx-module和ngx_devel_kit进行备份,(参考Nginx编译安装Lua模块)
然后需要重新安装nginx,其中两个备用的东西在配置的时候以--add-module=/XXX/YYY/ngx_devel_kit-XXXX的形式引入,然后安装等
配置文件修改如下,主要两步:1.block302;2.use rewirte_by_lua 使用lua语言进行逻辑处理:
proxy_intercept_errors on;
recursive_error_pages on;
location ~* ^/test2$ {
proxy_pass http://www.b.com/test2;
error_page 302 = @error_page_302;
}
# 拦截处理器,其中rewrite_by_lua中后面的字符串就是lua模块的代码,`string.gsub`字符串替换,`local upstream_http_location`定义变量
# `ngx.redirect`跳转到指定路径
location @error_page_302 {
rewrite_by_lua '
local upstream_http_location = string.gsub(ngx.var.upstream_http_location, "ac.95516.com","sp.xadaoke.cn")
ngx.redirect(upstream_http_location) ';
}
其他
如果要替换响应返回的内容,可以使用ngx_http_sub_module模块来处理。这个模块在安装nginx的时候需要配置--with-http_sub_module。配置需要如下代码:
location ~* ^/test3$ {
proxy_pass http://www.b.com/test3;
sub_filter '这个网页的原始内容' '这个网页的修改后内容';
}
总结
找了很多资料都找不到文章,写这个文章自己记录