自定义HTTP头时的注意事项(转)

原文:https://blog.gnuers.org/?p=462

HTTP头是可以包含英文字母([A-Za-z])、数字([0-9])、连接号(-)hyphens, 也可义是下划线(_)。在使用nginx的时候应该避免使用包含下划线的HTTP头。主要的原因有以下2点。
1.默认的情况下nginx引用header变量时不能使用带下划线的变量。要解决这样的问题只能单独配置underscores_in_headers on。
2.默认的情况下会忽略掉带下划线的变量。要解决这个需要配置ignore_invalid_headers off。

当然,nginx设置变量的时候是没有任何这样的限制的,可以直接设置带下划线的header。但是最好不要这样做。在使用nginx做多级代理的
时候,也需要注意一些header不要重复设置。比如用来保存用户IP的这个header只在最上层的nginx里配置就行,后面的nginx不要重复设
置导致覆盖。

简单测试一下多个nginx做代理的时候处理的思路,为了方便我就直接在一个nginx上跑多个server测试

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  ‘$http_orig_client_ip - $remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"  "$upstream_addr" ‘;
    sendfile        on;
    underscores_in_headers on;
    ignore_invalid_headers  off;
    keepalive_timeout  65;
 upstream test2081{
    server 10.209.128.28:2081;
}
 upstream test2082{
    server 10.209.128.28:2082;
}
 upstream test2083{
    server 10.209.128.28:80;
}
    server {
        listen       2080;
        server_name  localhost;
        access_log  logs/access80.log  main;
        location / {
            root   html;
        proxy_set_header ORIG_CLIENT_IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-By $server_addr:$server_port;
            proxy_set_header X-Forwarded-For $http_x_forwarded_for;
            proxy_pass http://test2081;
        }
    }
    server {
        listen       2081;
        server_name  localhost;
        access_log  logs/access81.log  main;
        location / {
            root   html;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-By $server_addr:$server_port;
            proxy_set_header X-Forwarded-For $http_x_forwarded_for;
            proxy_pass http://test2082;
        }
    }
    server {
        listen       2082;
        server_name  localhost;
        access_log  logs/access82.log  main;
        location / {
            root   html;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-By $server_addr:$server_port;
            proxy_set_header X-Forwarded-For $http_x_forwarded_for;
            proxy_pass http://test2083;
        }
    }
}

server 2080收到请求后会设置一个不规范的HTTP头,后面连接了2段server。发起请求后,日志如下

可以看到2081和2082的都是能正确传递好这个header的(包括机器上80端口跑的也是可以的)

时间: 2024-12-19 14:18:10

自定义HTTP头时的注意事项(转)的相关文章

nginx反向代理proxy_set_header自定义header头无效的问题

###案例1环境nginx,linux,tomcat域名访问是走nginx给后端服务器处理的,问题是域名经过nginx访问直接不能获取到headers,直接tomcat访问可以那么问题肯定在nginx上无法处理headers的问题了, 经过查询上面资料得到是nginx的锅,hearders有下划线的锅,nginx设置underscores_in_headers on,参照上面配置说.就可以处理,测试:http://apistore.baidu.com/astore/toolshttpproxyA

UICollectionView 自定义组头组尾的XIB方法

UICollectionView的加载方式和Tableview很像,基本上加载的方法都差不多,尤其是它的数据源的方法和代理方法基本上类似,只不过是名字上有点细微的差别而已.这里面不赘述. 1. UICollectionView为什么要自定义组头和组尾呢?原因是因为如果不自定义,系统会复用Cell,导致加载的控件出现重复的现象. 如下图: 绿色的view为组头,通过视图发现,组头上面的控件出现了叠加的现象. 如何解决上面复用的问题,使用initWithFrame的初始化视图的方法,当cell上的v

局部变量与全局变量在声明时的注意事项

/* ============================================================================ Name : TestVariable.c Author : lf Version : Copyright : Your copyright notice Description : 局部变量与全局变量在声明时的注意事项 全局变量只能要常量赋值,但是局部变量可用常量和表达式以及函数赋值. 这是为什么呢? 程序在开始执行时需要用适当的值来初

使用MySQL-Proxy读写分离时的注意事项

在动手操作前最好先安装好MySQL-Proxy,并配置好MySQL主从服务器.补充:新版MySQL已经内建支持 延迟问题 读写分离不能回避的问题之一就是延迟,可以考虑Google提供的SemiSyncReplicationDesign补丁. 端口问题 MySQL-Proxy缺省使用的是4040端口,如果你想透明的把3306端口的请求转发给4040的话,那么可以: iptables -t nat -I PREROUTING -s ! 127.0.0.1 -p tcp --dport 3306 -j

fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?

fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#include "stdafx.h""? vs开发时经常遇到没加stdafx.h头文件,解决办法就是吧预编译头去掉! fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#include "stdafx.h""?,布布扣,bubuko.com fatal error C1010: 在查找

Struts2 自定义拦截器时Action无法接收到参数

问题:自定义拦截器,没有添加defaultStack导致Action无法接受到参数 解决办法: 方法一,添加defaultStack,然后在Action中引用 自定义的stack,其实defaultStack中也有细分如basicStack等 <interceptors> <interceptor name="checkUser" class="com.common.interceptor.UserInfoInterceptor"></

页面重构时的注意事项

页面重构时的注意事项 1. 重构页面时,什么样的代码才算是好的代码? 2. 重构时如何告诉设计师,他设计的东西太丑? 1. 重构页面时,什么样的代码才算是好的代码? 这个我感觉要从三方面来做答,基础的就不说了,那些语义化,结构化,兼容性等等方面的问题.说说中级部分的: 页面的健壮性: 这个怎么说呢,按我的理解,UI出的psd图是一个页面理想状态下的形态,而真实上线后,会出现三种极端状态,一,数据极多,二,数据极少,三,数据刚好(其实就是PSD设置描述的一个状态).所以在页面排版的时候,考虑这设计

2016-07-07: 重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件

使用VS2008在一个解决方案中包含多个项目时,当设置多个项目的中间目录为同一个目录时,在增量编译时出现"重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件,请重新创建预编译头问题",从而导致整个解决方案每次都必须重新全部生成. 在msdn上获得如下信息: You may receive a "PRJ0008" or "C2471" or "C1083" or "D8022" or "

fatal error C1010: 在查找预编译头时遇到意外的文件结尾

错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#include "stdafx.h""? 错误分析: 此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束.没有找到预编译指示信息的头文件"stdafx.h". (因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #inc