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 '这个网页的原始内容' '这个网页的修改后内容';
    }
    

    总结

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

  • 相关阅读:
    leetcode 18 4Sum
    leetcode 71 Simplify Path
    leetcode 10 Regular Expression Matching
    leetcode 30 Substring with Concatenation of All Words
    leetcode 355 Design Twitte
    leetcode LRU Cache
    leetcode 3Sum
    leetcode Letter Combinations of a Phone Number
    leetcode Remove Nth Node From End of List
    leetcode Valid Parentheses
  • 原文地址:https://www.cnblogs.com/fenqi/p/11232949.html
Copyright © 2011-2022 走看看