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 '这个网页的原始内容' '这个网页的修改后内容';
}
总结
找了很多资料,都没有找到符合文章,自己写此文章记录一下
nginx处理302、303和修改response返回的header和网页内容的更多相关文章
- 测试调试-利用fiddler修改response返回结果
测试前端过程中,经常需要验证各种功能状态.不同数据层级等返回后的展示效果.一般会通过以下三种方式进行测试: 1.构造满足条件的测试数据:(耗时费力) 2.修改数据库:(前提需要了解数据库数据存储.沟通 ...
- controller修改response返回值
1.responseBodyAdvice2. aop3.过滤器.拦截器
- java使用Filter过滤器对Response返回值进行修改
转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...
- 转:java使用Filter过滤器对Response返回值进行修改
练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...
- java内部发送http请求并取得返回结果,修改response的cookie
public Object userLogin(HttpServletRequest request, HttpServletResponse response, String email, Stri ...
- nginx日志中添加请求的response日志
换个新公司,做一些新鲜的事情,经过一天的琢磨,终于成功添加response日志 在nginx的日志中添加接口response的日志 由于此功能在nginx内置的功能中没有,需要安装第三方模块ngx_l ...
- 详解重定向(HTTP状态码301/302/303/307/408)附例子
本文为原创文章,转载请注明出处. 今天打算好好把状态码301.302.303.307.308好好撸一遍,并会测试下一些例子. 状态码的解释 我们都知道重定向与这几种状态码有关,来看下这几种HTTP状态 ...
- Python requests 301/302/303重定向(跨域/本域)cookie、Location问题
今天使用request的get方法获取一个网站的登录页信息,结果使用charles抓包的时候发现该网站登录页303(重定向的问题),网上查了很多资料,原因如下: 一.cookie 原因:利用reque ...
- tengine无法解析ssi报错 Nginx: unsafe URI detected while sending response
Nginx: unsafe URI detected while sending response 现象:# 类似 <!--#include virtual="../library/h ...
随机推荐
- C++与QML混合编程实现2048
http://blog.csdn.net/ieearth/article/details/42705305
- 如何保证MQ消息必达
此文章属于笔记,原属58沈剑 一.MQ消息必达,架构上的两个核心设计点: 消息落地 消息超时.重传.确认 四大部件:发送端 接收端 服务端 固化存储组成 二.上半场消息必达以及消息重复问题 上半场的流 ...
- SYN2101型 NTP网络时间服务器
SYN2101型 NTP网络时间服务器 时钟校准服务器时间 ntp服务器ntp时间校准服务器使用说明视频链接: http://www.syn029.com/h-pd-56-0_310_1_-1. ...
- Spring Boot的学习之路(03):基础环境搭建,做好学习前的准备工作
1. 前言 <论语·魏灵公>:"工欲善其事,必先利其器.居是邦也,事其大夫之贤者,友其士之仁者." 工欲善其事必先利其器.我们在熟悉一个陌生项目的时候,首先会大概去看一 ...
- CrossOver for Mac v18.5 中文破解版下载-可以安装Windows软件
CrossOver for Mac v18.5 中文破解版: http://h5ip.cn/kADD Crossover Mac 破解版是Mac 和 Windows 系统之间的兼容工具.使 Mac 操 ...
- Ubuntu --- 安装lnmp(php7.0)
1.安装nginx sudo apt-get install nginx # 安装 sudo vim /etc/nginx/sites-enabled/default # 修改配置文件 sudo ng ...
- Const用法总结(快速区分指针常量与常量指针)
想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助. 有时候我们希望定义一种常量,它的值不能被修改,这 ...
- AIX/Linux/HP-UX查看CPU/内存/磁盘/存储命令
1.1 硬件环境验证方式 硬件环境主要包括CPU.内存.磁盘/存储.网络设备(如F5等).系统特有设备(如密押设备等)等,其中网络设备和系统特有设备由网络管理员或项目组提供为准,本节主要关注CP ...
- maven的下载与安装,卸载替换eclipse自带的maven
首先呢,博主在这里给大家一个建议,最好不要用eclipse自带的maven.因为这家伙总会出现一些这样那样的错误,比如常见的jar包下载不全或者是install打包报错等等. 博主用了一段时间,还是觉 ...
- Go - Struct 结构体
目录 概述 声明结构体 生成 JSON 改变数据 推荐阅读 概述 结构体是将零个或多个任意类型的变量,组合在一起的聚合数据类型,也可以看做是数据的集合. 声明结构体 //demo_11.go pack ...