Nginx Routing Based on Headers

Nginx Routing Based on Headers

Today we meet one requirement that we need to parse and check the request header to see which server we prefer to routing to.
At first, I thought that nginx can not do that, only my lovely ha-proxy can do that.

Finally, I found that there is just lack of document to see how to do the header based routing for nginx.

I tried these configurations, it works, but I am not sure if it is the best practice.
upstream

contentcenter2 {

 ip_hash; server localhost:8201;   

}    

upstream

sillycat {        

 ip_hash;         server localhost:9000;    

}

map $http_x_header $xheader {           

 default 1;           

 "ironwolf" 2;   

}

        location / {          

proxy_pass                  http://contentcenter$xheader;    

proxy_redirect              off;           

proxy_set_header            Host $host;           

proxy_set_header            X-Real-IP $remote_addr;          

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;          

client_max_body_size        10m;          

client_body_buffer_size     128k;          

proxy_connect_timeout       90;          

proxy_send_timeout          90;          

proxy_read_timeout          90;          

proxy_buffer_size           4k;          

proxy_buffers               4 32k;          

proxy_busy_buffers_size     64k;          

proxy_temp_file_write_size  64k;

}

So, that is it.
If we plan to visit the contentcenter1 or contentcenter2, we just need to put the X-HEADER with value ironwolf or other value.


References:
http://nginx.org/en/docs/http/ngx_http_map_module.html
http://stackoverflow.com/questions/9168377/nginx-response-based-on-the-requested-header


<think>好的,我现在需要帮助用户解决在Nginx中启用underscores_in_headers配置项的问题。首先,我要回忆一下之前用户提供的引用内容,里面提到了Nginx默认不识别带有下划线的请求头参数,导致参数丢失。解决方法是在配置文件中添加underscores_in_headers on,并重启服务。 接下来,我需要确保自己正确理解这个配置的作用。根据引用内容,当这个选项设为off时,Nginx会忽略带有下划线的头字段,而设为on则允许使用下划线。因此,用户需要正确配置这个参数,以确保后端服务器能接收到这些头信息。 用户的问题是如何正确配置这个选项,所以我的回答需要给出具体的步骤。首先,我应该指导用户找到Nginx的配置文件,通常是nginx.conf或者包含在sites-available目录中的特定站点配置。然后,在http、server或location块中添加underscores_in_headers on;这一行。需要提醒用户根据实际需求选择配置的位置,不同的块作用域不同,比如http块全局生效,server块针对特定服务,location块针对特定路径。 另外,用户可能需要知道如何检查配置文件是否正确,以及如何重启Nginx服务。因此,应该包括使用nginx -t命令测试配置,然后使用systemctl或service命令重启Nginx。这些步骤能帮助用户避免配置错误导致服务无法启动的问题。 还要考虑可能的验证步骤,比如如何测试配置是否生效。可以建议用户使用curl命令发送带有下划线头字段的请求,或者查看后端日志确认是否接收到参数。这样用户能够自行验证配置是否成功。 需要确保回答结构清晰,分步骤说明,并且语言简洁明了。同时,要引用提供的参考资料来支持回答的正确性,比如引用中的说明和配置示例。这样用户会更有信心按照指导操作。 最后,考虑到用户可能遇到的常见问题,比如配置位置错误或忘记重启服务,应该在注意事项中提醒这些点。此外,可能还需要提到版本兼容性,因为某些旧版本的Nginx可能不支持这个指令,但根据引用中的信息,这个配置在0.7版本后的变更中提到,所以大部分现代版本应该支持。 总结回答的步骤:定位配置文件、添加指令、测试配置、重启服务、验证效果。同时,给出具体的示例配置片段,帮助用户直观理解如何修改。这样用户能够一步步跟随操作,解决问题。</think>### 如何在Nginx中配置`underscores_in_headers on` #### 配置步骤 1. **定位Nginx配置文件** 根据部署场景,配置文件可能位于以下路径: - 全局配置:`/etc/nginx/nginx.conf` - 站点级配置:`/etc/nginx/sites-available/`目录下的具体文件(如`default`) 2. **修改配置文件** 在`http`、`server`或`location`块中添加指令: ```nginx http { underscores_in_headers on; # 作用于全局HTTP请求头[^1][^4] } ``` 或针对特定服务: ```nginx server { underscores_in_headers on; # 仅当前server块生效[^3] } ``` 3. **测试配置并重启Nginx** - 检查语法: ```bash nginx -t # 输出应为"syntax is ok" ``` - 重启服务: ```bash systemctl restart nginx # 或 service nginx restart ``` #### 验证配置 - **方法1:使用`curl`测试** 发送带下划线的请求头: ```bash curl -H "X-Custom_Header: test" http://your-domain.com ``` 检查后端日志是否收到`X-Custom_Header`参数。 - **方法2:抓包分析** 通过`tcpdump`或`Wireshark`确认请求头是否完整传输[^5]。 #### 注意事项 1. **作用域优先级** `location > server > http`,越具体的块优先级越高[^2]。 2. **版本兼容性** Nginx 0.7+版本支持此指令,旧版本需升级[^2]。 3. **安全性影响** 启用后需确保请求头过滤逻辑完善,避免注入攻击[^5]。 #### 示例场景 若接口需要传递`X-Auth_Token`,配置后后端可正确接收该参数,解决鉴权失败问题[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值