原文: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  ;
events {
worker_connections ;
}
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 ;
upstream test2081{
server 10.209.128.28:;
}
upstream test2082{
server 10.209.128.28:;
}
upstream test2083{
server 10.209.128.28:;
}
server {
listen ;
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 ;
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 ;
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端口跑的也是可以的)

最新文章

  1. sublime3破解版sublime3注册码
  2. SignalR 远程访问并跨域
  3. 关于eclipse删除servers之后,不能新建其所对应版本的Servers
  4. 使用jQuery解析JSON数据(由ajax发送请求到php文件处理数据返回json数据,然后解析json写入html中呈现)
  5. laravel各种路径的获取方法
  6. NeHe OpenGL教程 第三十八课:资源文件
  7. [转]HttpClient的超时用法小记
  8. WinForm 实现登录,验证成功,关闭登录界面,显示主界面
  9. (三)学习CSS之opacity 属性
  10. sql Server 发送邮件 错误类型及原因
  11. python challenge 待续中
  12. egret随笔-egret浅入浅出
  13. json 的 使用方法以及与数组的区别
  14. 简单Elixir游戏服务器-安装Elixir
  15. POJ 3468 A Simple Problem with Integers(树状数组区间更新) 续
  16. 批处理文件:windows下关闭指定端口
  17. Python并发编程之创建多线程的几种方法(二)
  18. python类与对象-如何让对象支持上下文管理
  19. March 05th, 2018 Week 10th Monday
  20. 转 利用java反射实现两个具有相同属性bean赋值

热门文章

  1. CSS学习笔记(11)--Flex 布局教程:语法篇
  2. 纯css3实现的竖形二级导航
  3. 关于报错“syntax error near unexpected token `”和回车换行
  4. SSH三大框架的知识题
  5. 【BZOJ】1613: [Usaco2007 Jan]Running贝茜的晨练计划(dp)
  6. 分享在github超酷超炫特效动画,不看你会懊悔的。
  7. 做一个WINDOWS下破解WIFI。不须要Linux抓包!
  8. 简单是Jedis实例(相对连接池而言)
  9. Linux命令之乐--rename
  10. ajax的轮询和长轮询