zoukankan      html  css  js  c++  java
  • nginx做网站转发时处理302、303返回状态码、修改response返回的header和网页内容

    背景

    遇到一个限制域名的平台,于是使用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 '这个网页的原始内容' '这个网页的修改后内容';
    }
    

    总结

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

  • 相关阅读:
    网络编程之即时通信程序(聊天室)(一)通信流程简介及通信协议定制
    C#常用加密方法解析
    ASP.NET常用数据绑定控件优劣总结
    使用XPO开发时可以参考使用的架构
    渠道会上的体会
    如何利用第三方SDK开发MSN机器人以及实现语音视频?
    对 XPO 的一些问题的解答
    c++ 参数传递 之引用形参 GIS
    指针与引用的区别 GIS
    c++ const 修饰数组 GIS
  • 原文地址:https://www.cnblogs.com/fenqi/p/11232949.html
Copyright © 2011-2022 走看看