nginx参数-$proxy_host和$http_host

1.通过一个简单的java程序

public class HeadController {
    @ResponseBody
    @RequestMapping("/head")
    public String testHead(HttpServletRequest request){
        Enumeration<String> headerNames = request.getHeaderNames();
        StringBuffer sbf =new StringBuffer();
        while(headerNames.hasMoreElements()){
            String element = headerNames.nextElement();
            System.out.println(element+":"+request.getHeader(element));
            sbf.append(element+":"+request.getHeader(element));
        }
   return   sbf.toString();
    }
}

输出所有的请求头信息

2.修改/etc/hosts文件

127.0.0.1 nginx-test.yyf.com

3.nginx配置

 server {
        listen   80;
        server_name  nginx-test.yyf.com;
        location / {
              proxy_pass http://127.0.0.1:8080;
     }
}

4.关于 proxy_set_header Host参数

4.1.直接访问nginx-test.yyf.com:8080/head 不经过nginx

# curl nginx-test.yyf.com:8080/head
user-agent:curl/7.29.0
host:nginx-test.yyf.com:8080
accept:*/*

输出的host是实际访问的host nginx-test.yyf.com:8080

4.2通过nginx 访问nginx-test.yyf.com/head

# curl nginx-test.yyf.com/head
host:127.0.0.1:8080
connection:close
user-agent:curl/7.29.0
accept:*/*

输出的host是转发的请求路径127.0.0.1:8080
默认proxy_set_header Host 选项为$proxy_host 就是你转发的请求host

4.3加上参数

proxy_set_header Host $http_host;
curl nginx-test.yyf.com/head
host:nginx-test.yyf.com/nconnection:close/nuser-agent:curl/7.29.0/naccept:*/*/n

访问的host就变成了实际的访问host nginx-test.yyf.com

4.4.设置固定的值

修改参数

 proxy_set_header Host ""kubia.example.com";
curl nginx-test.yyf.com/head
You've hit kubia-t2jmj

访问的页面也变化了,说明host参数能让nginx根据请求找到对应服务
即使访问的url还是 nginx-test.yyf.com/head

参考:https://www.cnblogs.com/jsonhc/p/7199295.html?utm_source=itdadao&utm_medium=referral

### 正确配置 Nginx 反向代理规则 为了正确设置 Nginx 的反向代理规则 `proxy_pass` 并处理相关的头部信息(如 Host、X-Real-IP X-Forwarded-For),可以按照以下方式完成。 #### 1. 基本概念说明 Nginx 中的 `proxy_set_header` 指令用于修改或添加发送给后端服务器的 HTTP 请求头字段。这在反向代理场景下非常重要,因为它可以帮助保留原始客户端的信息并增强安全性[^1]。 对于 API 请求来说,通常需要关注以下几个关键点: - **Host**: 后端服务可能依赖于主机名来路由请求。 - **X-Real-IP**: 记录真实的客户端 IP 地址。 - **X-Forwarded-For**: 跟踪经过多个中间节点后的客户端真实地址链路。 #### 2. 配置实例解析 以下是标准的 Nginx 配置模板: ```nginx server { listen 80; server_name api.example.com; location /api/ { proxy_pass http://backend_server; # 替换为目标API的实际URL # 设置Host头为原始请求中的Hostproxy_set_header Host $host; # 添加X-Real-IP头记录客户端的真实IP proxy_set_header X-Real-IP $remote_addr; # 更新X-Forwarded-For头以追加当前跳转的客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 如果有其他自定义需求,也可以在此处扩展更多header } } ``` 上述配置中: - `$host`: 动态获取客户端请求的目标域名,并将其传递至后端服务器[^3]。 - `$remote_addr`: 获取直接与 Nginx 连接的客户端 IP 地址[^2]。 - `$proxy_add_x_forwarded_for`: 自动将现有 `X-Forwarded-For` 字段的内容附加到新加入的客户端 IP 上,适用于多级代理环境下的情况。 #### 3. 特殊场景考虑 如果存在多层次的 Nginx 或负载均衡器,则需要注意以下事项: - 当前层应始终使用 `$proxy_add_x_forwarded_for` 来更新而非简单替换 `X-Forwarded-For`,以免丢失上游已有的数据链条[^4]。 例如,在外层内层分别做如下调整即可满足复杂架构的需求: ```nginx # 外层 location /testApi1 { proxy_pass http://kwtest1; proxy_set_header X-Forwarded-For $remote_addr; } # 内层 location /testApi2 { proxy_pass http://kwtest2; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ``` 这样能够确保每一步都准确无误地保存了完整的访问路径信息。 #### 4. Web 应用层面读取用户 IP 方法 最终到达目标应用程序时,可以通过检查这些特定 Header 来识别用户的实际来源地址。大多数现代框架均支持便捷方法提取此类元数据;比如 PHP 中可通过 $_SERVER['HTTP_X_FORWARDED_FOR'] 或者 $_SERVER['REMOTE_ADDR'] 实现相应逻辑判断。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值