nginx做网站转发时处理302、303返回状态码、修改response返回的header和网页内容

背景

遇到一个限制域名的平台,于是使用nginx在做网站转发,其中目标网站在访问过程中使用了多个302、303的返回状态,以便跳转到指定目标(为什么限制,就是防止他的网站的镜像)。

在查找了一段资料后,发现nginx可以proxy网站,让其在自己的网站路径上访问。本文总共解决以下两个需求:

访问指定路径时,代理指定网站
解决302、303状态码的网站
修改response的header
修改response的网页内容

1. 访问指定路径跳转到网站
使用proxy_pass指令来实现,示例如下
# 访问http://www.a.com/jump,就跳到指定路径http://www.b.com/jump ,配置如下

location ~* ^/jump$ {
    proxy_pass http://www.b.com/jump;
}

2. 解决302,303的状态码nginx直接返回问题
在代理目标网站时,目标网站使用了302的状态码,这样nginx直接返回后,网址变了,不受本网站的控制,下来就解决此问题:
使用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网站映射到当前网站的/目录
}

以上代码过程:访问http://www.a.com/jump时,nginx后台会访问http://www.b.com/jump获取返回内容,且状态码时302,如果不控制的话,浏览器会把302中location拿出来直接访问,而location是c网站的网址,有两种办法一种是修改location然后返回,一种是就是proxy_redirect方式。

3. 修改response的header
前两点是直接路径跳转的,现在又有一个需求就是修改302中的location中的一些参数,那么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.拦截302;2.使用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) ';
}

其他
如果想替换response返回的内容,可以使用ngx_http_sub_module模块来处理,这个模块需要在安装nginx时配置加上--with-http_sub_module,配置中需要如下代码:

location ~* ^/test3$ {
    proxy_pass http://www.b.com/test3;
    sub_filter '这个网页的原始内容' '这个网页的修改后内容';
}

总结
找了很多资料,都没有找到符合文章,自己写此文章记录一下

点赞