背景

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

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

  1. 访问指定路径时,代理指定网站
  2. 解决302、303状态码的网站
  3. 修改response的header
  4. 修改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-modulengx_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和网页内容的更多相关文章

  1. 测试调试-利用fiddler修改response返回结果

    测试前端过程中,经常需要验证各种功能状态.不同数据层级等返回后的展示效果.一般会通过以下三种方式进行测试: 1.构造满足条件的测试数据:(耗时费力) 2.修改数据库:(前提需要了解数据库数据存储.沟通 ...

  2. controller修改response返回值

    1.responseBodyAdvice2. aop3.过滤器.拦截器

  3. java使用Filter过滤器对Response返回值进行修改

    转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...

  4. 转:java使用Filter过滤器对Response返回值进行修改

    练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...

  5. java内部发送http请求并取得返回结果,修改response的cookie

    public Object userLogin(HttpServletRequest request, HttpServletResponse response, String email, Stri ...

  6. nginx日志中添加请求的response日志

    换个新公司,做一些新鲜的事情,经过一天的琢磨,终于成功添加response日志 在nginx的日志中添加接口response的日志 由于此功能在nginx内置的功能中没有,需要安装第三方模块ngx_l ...

  7. 详解重定向(HTTP状态码301/302/303/307/408)附例子

    本文为原创文章,转载请注明出处. 今天打算好好把状态码301.302.303.307.308好好撸一遍,并会测试下一些例子. 状态码的解释 我们都知道重定向与这几种状态码有关,来看下这几种HTTP状态 ...

  8. Python requests 301/302/303重定向(跨域/本域)cookie、Location问题

    今天使用request的get方法获取一个网站的登录页信息,结果使用charles抓包的时候发现该网站登录页303(重定向的问题),网上查了很多资料,原因如下: 一.cookie 原因:利用reque ...

  9. tengine无法解析ssi报错 Nginx: unsafe URI detected while sending response

    Nginx: unsafe URI detected while sending response 现象:# 类似 <!--#include virtual="../library/h ...

随机推荐

  1. C++与QML混合编程实现2048

    http://blog.csdn.net/ieearth/article/details/42705305

  2. 如何保证MQ消息必达

    此文章属于笔记,原属58沈剑 一.MQ消息必达,架构上的两个核心设计点: 消息落地 消息超时.重传.确认 四大部件:发送端 接收端 服务端 固化存储组成 二.上半场消息必达以及消息重复问题 上半场的流 ...

  3. SYN2101型 NTP网络时间服务器

    SYN2101型  NTP网络时间服务器   时钟校准服务器时间 ntp服务器ntp时间校准服务器使用说明视频链接: http://www.syn029.com/h-pd-56-0_310_1_-1. ...

  4. Spring Boot的学习之路(03):基础环境搭建,做好学习前的准备工作

    1. 前言 <论语·魏灵公>:"工欲善其事,必先利其器.居是邦也,事其大夫之贤者,友其士之仁者." 工欲善其事必先利其器.我们在熟悉一个陌生项目的时候,首先会大概去看一 ...

  5. CrossOver for Mac v18.5 中文破解版下载-可以安装Windows软件

    CrossOver for Mac v18.5 中文破解版: http://h5ip.cn/kADD Crossover Mac 破解版是Mac 和 Windows 系统之间的兼容工具.使 Mac 操 ...

  6. Ubuntu --- 安装lnmp(php7.0)

    1.安装nginx sudo apt-get install nginx # 安装 sudo vim /etc/nginx/sites-enabled/default # 修改配置文件 sudo ng ...

  7. Const用法总结(快速区分指针常量与常量指针)

    想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助. 有时候我们希望定义一种常量,它的值不能被修改,这 ...

  8. AIX/Linux/HP-UX查看CPU/内存/磁盘/存储命令

    1.1    硬件环境验证方式 硬件环境主要包括CPU.内存.磁盘/存储.网络设备(如F5等).系统特有设备(如密押设备等)等,其中网络设备和系统特有设备由网络管理员或项目组提供为准,本节主要关注CP ...

  9. maven的下载与安装,卸载替换eclipse自带的maven

    首先呢,博主在这里给大家一个建议,最好不要用eclipse自带的maven.因为这家伙总会出现一些这样那样的错误,比如常见的jar包下载不全或者是install打包报错等等. 博主用了一段时间,还是觉 ...

  10. Go - Struct 结构体

    目录 概述 声明结构体 生成 JSON 改变数据 推荐阅读 概述 结构体是将零个或多个任意类型的变量,组合在一起的聚合数据类型,也可以看做是数据的集合. 声明结构体 //demo_11.go pack ...