nginx替换响应头(重点:如何在替换时加上if判断)

时间:2021-08-29 23:52:31

  在实现微信小程序内嵌非业务域名时,通过nginx做镜像网站绕过小程序业务域名检测,但有一些表单页面提交后会返回一个302状态,由响应头Location的值决定提交成功后的跳转地址。那么问题来了,这个地址也是属于非业务域名,这个时候我们就需要将这个响应头也替换掉,那么nginx如何替换响应头呢,请看下面教程:

  一、安装使用ngx_headers_more模块定制响应头:

    ngx_headers_more 用于添加、设置和清除输入和输出的头信息。nginx没有内置该模块,需要另行添加。

    (1)下载地址:https://github.com/openresty/headers-more-nginx-module/tags

    (2)平滑升级nginx(参考上篇为nginx平滑添加SSL模块的文章:http://www.cnblogs.com/kenwar/p/8295907.html 添加参数add-module=/解压缩后文件路径)

    (3)指令说明(我这边只用到设置响应头的指令,所以只介绍一个指令,如有兴趣请自行查找其使用说明):      

        more_set_headers
        语法:more_set_headers [-t <content-type list>]... [-s <status-code list>]... <new-header>...
        默认值:no
        配置段:http, server, location, location if
        阶段:输出报头过滤器
        替换(如有)或增加(如果不是所有)指定的输出头时响应状态代码与-s选项相匹配和响应的内容类型的-t选项指定的类型相匹配的。
        如果没有指定-s或-t,或有一个空表值,无需匹配。因此,对于下面的指定,任何状态码和任何内容类型都讲设置。

        more_set_headers "Server: my_server";
        more_set_headers "Server: my_server";

        具有相同名称的响应头总是覆盖。如果要添加头,可以使用标准的add_header指令代替。
        单个指令可以设置/添加多个输出头。如:

        more_set_headers 'Foo: bar' 'Baz: bah';
        more_set_headers 'Foo: bar' 'Baz: bah';

        在单一指令中,选项可以多次出现,如:

        more_set_headers -s 404 -s '500 503' 'Foo: bar';

        more_set_headers -s 404 -s '500 503' 'Foo: bar';

        等同于:

        more_set_headers -s '404 500 503' 'Foo: bar';

        more_set_headers -s '404 500 503' 'Foo: bar';

        新的头是下面形式之一:
        Name: Value
        Name:
        Name
        最后两个有效清除的头名称的值。Nginx的变量允许是头值,如:

        set $my_var "dog";
        more_set_headers "Server: $my_var";
        set $my_var "dog";
        more_set_headers "Server: $my_var";

        注意:more_set_headers允许在location的if块中,但不允许在server的if块中。下面的配置就报语法错误:

        # This is NOT allowed!
        server {
        if ($args ~ 'download') {
          more_set_headers 'Foo: Bar';
        }
        ...
        }

  二、简单替换302状态下的响应头Location:

    location /{
    more_set_header "Location" "https://www.demo.com/xxx/index.html"
    }

  三、(重点)使用正则表达式有选择的替换Location:

    我们如果需要根据响应头里的内容来选择何种替换方式,该怎么做?

    需求:在location中判断响应头Location字段如果值为a(假设值),则将Location设置为b,其他忽略

    (1)初步尝试:

    location /{
      if($upstream_http_Location ~ a){
      more_set_header "Location" "https://www.demo.com/xxx/index.html"
      }     }

      然而这里的if怎么都进不去,通过google得知是因为,在请求传递到后端之前,if就已经判断了,所以$upstream_http_Location是没有值的,这里可以使用一个map来有根据响应头的值有条件的执行操作

 map $upstream_http_Location $location{
~a https://www.democom/xxx/success.html;
default $upstream_http_Location;
}
server{
listen 80;
listen 443 ssl;
ssl_certificate /usr/local/nginx/ssl/www3.xiaolintong.net.cn/www3.xiaolintong.net.cn-ca-bundle.crt;
ssl_certificate_key /usr/local/nginx/ssl/www3.xiaolintong.net.cn/www3.xiaolintong.net.cn.key;
autoindex on;
#开启读取非nginx标准的用户自定义header(开启header的下划线支持)
underscores_in_headers on;
server_name xxxxxxxxx;
access_log /usr/local/nginx/logs/access.log combined;
index index.html index.htm index.jsp index.php;
#error_page 404 /404.html;
........
location ^~/f/ {
more_set_headers -s '' 'Location $location'; }
.......
}

      这里仅提供一个思路,请根据自己的需求灵活的使用map

nginx替换响应头(重点:如何在替换时加上if判断)的更多相关文章

  1. nginx修改响应头&lpar;可屏蔽后端服务器的信息:IIS&comma;PHP等&rpar;

    修改nginx反向代理请求的Header 需要使用到proxy_set_header和add_header指令.其中: proxy_set_header 来自内置模块ngx_http_proxy_mo ...

  2. Nginx 操作响应头信息的实现

    前置条件:需要编译 ngx_http_headers_module 模块,才支持 header 头信息操作 add_header 意思为将自定义的头信息的添加到响应头,指令为 add_header n ...

  3. nginx替换响应内容

    因为想要将非业务域名内嵌到微信小程序中,所以用到了nginx的反向代理功能来替换域名实现盗站(缘起:http://www.cnblogs.com/kenwar/p/8288882.html),但是替换 ...

  4. Nginx配置各种响应头防止XSS&comma;点击劫持&comma;frame恶意攻击

    为什么要配置HTTP响应头? 不知道各位有没有被各类XSS攻击.点击劫持 (ClickJacking. frame 恶意引用等等方式骚扰过,百度联盟被封就有这些攻击的功劳在里面.为此一直都在搜寻相关防 ...

  5. nginx自定义模块记录上游服务器特定响应头

    功能,服务器通过扩展自定义命令,记录上游的服务器返回的特定响应头内容,记录到本地文件中 代码如下: /* * Copyright (C) Ciaos */ #include <ngx_confi ...

  6. 修改nginx的http响应头server字段

    信息泄露类型:HTTP服务器响应头Server字段信息泄露 示例: 解决: 需要重新对nginx编译安装: [root@localhost ~]# tar zxvf nginx-1.8.1.tar.g ...

  7. 【Nginx】修改响应头,根据不同请求IP重定向到不同IP

    背景: 使用CAS登录的过程中会涉及到三次重定向,如果在同一个局域网内,是没有任何问题的,但如果涉及到跨网访问,这个问题就比较蛋疼了. 解决思路: 通过Nginx对要访问的系统进行代理,根据请求IP来 ...

  8. nginx 定义:响应头和请求头

    1) 响应头 add_header 例如: add_header Cache-Control no-cache; add_header Access-Control-Allow-Origin *; a ...

  9. Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码

    请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...

随机推荐

  1. mysql中获取一天、一周、一月时间数据的各种sql语句写法

    今天抽时间整理了一篇mysql中与天.周.月有关的时间数据的sql语句的各种写法,部分是收集资料,全部手工整理,自己学习的同时,分享给大家,并首先默认创建一个表.插入2条数据,便于部分数据的测试,其中 ...

  2. 咏南多层开发框架支持最新的DELPHI 10 SEATTLE

    购买了咏南多层开发框架的老用户如有需要提供免费升级. 中间件

  3. WIN2003服务器IIS下如何开启GZIP压缩

    在上一篇文章黑客流谈到了关于网页打开速度对SEO的影响,其中提到了网页开启Gzip压缩的好处,接下来我来和大家分享一下WINDOWS系统IIS服务器下如何开启Gzip压缩. 首先我们来了解一下什么是G ...

  4. javascript 事件委托 和jQuery事件绑定on、off 和one

    一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中, ...

  5. Struts2权威指南笔记

    Struts2权威指南笔记 1.mvc特点包括: ① 多个视图可以对应一个模型 ② 模型返回的数据与显示逻辑分离 ③ 应用层被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性 ④ 控制层的概念也 ...

  6. Java单例模式之饿汉模式与懒汉模式

    单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...

  7. SmartSql 常见问题

    常见问题 为什么不支持 Linq? SmartSql 希望 开发人员更多的接触 Sql ,获得绝对的控制权与安全感.所以目前没有计划支持 Code First 编程模式. 我想好了Sql怎么写,然后再 ...

  8. &lowbar;&lowbar;x&lowbar;&lowbar;&lpar;44&rpar;0910第六天&lowbar;&lowbar;表单

    form表单: form必须属性:action,指定一个服务器地址. 若希望表单中的数据发送给服务器,必须设置name属性. 用户填写的信息,将会追加在url地址?后面,以查询字符串的形式发送给服务器 ...

  9. k8s部署失败原因

    可以通过 kubectl describe pods *** --namespace=**** 查看问题描述

  10. jmeter测试文件上传接口报错:connection reset by peer&colon; socket write error

    最近在对文件上传接口性能测试时,设置150线程数并发时,总会出现以下错误:connection reset by peer: socket write error 在网上搜索了一下,得到的原因有这些: ...