背景
在查找了一段资料后,发现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 '这个网页的原始内容' '这个网页的修改后内容'; }
总结
找了很多资料,都没有找到符合文章,自己写此文章记录一下