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 ...
随机推荐
- FilterFactory是一款将图片转换成SVG的在线生成工具。
FilterFactory是一款将图片转换成SVG的在线生成工具. FilterFactory 彩蛋爆料直击现场 FilterFactory是一款将图片转换成SVG的在线生成工具.
- Delphi 10.2 Tokyo的新特性
Delphi 10.2(Tokyo)出来一段时间了,最重要的新特性就是支持Linux的服务端. 官网有详细的介绍: 这里是主要的特性介绍:https://www.embarcadero.com/pro ...
- JavaScript规定了几种语言类型?
JavaScript中的每一个值都有它自己的类型,JavaScript规定了七种语言类型: 1.Undefined 2.Null 3.Boolean 4.String 5.Number 6.Symbo ...
- SYN2306C型 GPS北斗授时导航接收机
SYN2306C型 GPS北斗授时导航接收机 北斗对时系统北斗标准同步时钟北斗卫星校时器使用说明视频链接: http://www.syn029.com/h-pd-222-0_310_36_-1.htm ...
- Linux基础及系统优化
1 如何实现自动挂载操作(光驱自动挂载--fstab) 1.1 方法 第一种方法:编辑fstab文件 vi /etc/fstab /dev/cdrom /mnt iso9660 default 0 0 ...
- spring 5.x 系列第17篇 —— 整合websocket (xml配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 项目模拟一个简单的群聊功能,为区分不同的聊 ...
- 【fullGC】内存监控工具
什么是fullGC: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在最近几个版本的J ...
- 分布式全局ID生成方案
传统的单体架构的时候,我们基本是单库然后业务单表的结构.每个业务表的ID一般我们都是从1增,通过AUTO_INCREMENT=1设置自增起始值,但是在分布式服务架构模式下分库分表的设计,使得多个库或多 ...
- 项目总结之echarts 使用
项目上需要使用echarts,对于一个新手前端来说,差点要爆炸了,自身前端基础就不好,echarts就更是不熟了,硬生生的逼着要一周做完一个系统.这算是个小总结吧,以后万一用的上捏. 渐变使用 项目中 ...
- 微服务-springboot热部署
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. IDEA进行热 ...