PHP中 HTTP_HOST 和 SERVER_NAME 的区别 MiMi Posted on 2010.07.02 10:25 // 2 Comments

PHP中HTTP_HOST与SERVER_NAME的区别
本文通过亲测及官方文档对比分析了PHP中_HTTP_HOST_与_SERVER_NAME_两个变量的区别,阐述了它们在不同场景下的表现,并推荐了在实际开发中更可靠的选项。

最近在开发站群软件,用到了根据访问域名判断子站点的相关问题。PHP获取当前域名有两个变量 HTTP_HOST 和 SERVER_NAME,我想知道两者的区别以及哪个更加可靠。

首先我想说,百度上那些转来转去的文章都是扯淡!
有说相同的,有说不同的,都没说明原因,没经过验证就互相转来转去的,浪费观众时间。

下面说说本人经过亲自验证 + 查阅官方文档 + 官方BUG列表 + 官方邮件列表 + sitepoint + webmasterworld + google的总结:

相同点:
当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范

不同点:
1. 通常情况:
_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。
_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。

2. 当服务器为非80端口时:
_SERVER["HTTP_HOST"] 会输出端口号,例如:mimiz.cn:8080
_SERVER["SERVER_NAME"] 会直接输出ServerName值
因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT

3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:
httpd.conf配置如下:
<virtualhost *>
ServerName mimiz.cn
ServerAlias www.mimiz.cn
</virtualhost>
客户端访问域名www.mimiz.cn
_SERVER["HTTP_HOST"] 输出 www.mimiz.cn
_SERVER["SERVER_NAME"] 输出 mimiz.cn

所以,在实际程序中,应尽量使用_SERVER["HTTP_HOST"] ,比较保险和可靠。

<think>我们正在配置Nginx实现两个不同路径的反向代理。具体需求是:1.将路径`/sso/`反向代理到`http://10.251.22.122:8700/sso/`2.将路径`/web/`反向代理到`http://10.251.22.248:80/`在Nginx中,我们可以使用`location`指令来匹配特定的路径,然后使用`proxy_pass`指令将请求转发到指定的后端服务器。注意:在配置反向代理时,我们通常需要注意路径的匹配传递。特别是,我们可能需要处理路径中的斜杠代理后的路径问题。对于第一个代理:`/sso/`到`http://10.251.22.122:8700/sso/`-我们使用`location/sso/`来匹配以`/sso/`开头的请求。-在`proxy_pass`中,我们直接指定目标URL,包括`/sso/`路径。这样,当请求`http://your_nginx_domain/sso/login`时,会被代理到`http://10.251.22.122:8700/sso/login`。对于第二个代理:`/web/`到`http://10.251.22.248:80/`-同样,使用`location/web/`来匹配以`/web/`开头的请求。-注意,目标URL是`http://10.251.22.248:80/`,这里末尾的斜杠很重要。它意味着将`/web/`后面的部分拼接到这个URL后面。例如,请求`http://your_nginx_domain/web/index.html`会被代理到`http://10.251.22.248:80/index.html`。但是,有时候我们可能希望保留原始路径中的`/web/`前缀,那么我们需要在目标URL中加上这个前缀(如果后端服务需要的话)。但根据需求,目标地址是`http://10.251.22.248:80/`,它没有`/web/`路径,所以我们希望去掉`/web/`前缀。而上面配置中,由于我们在`proxy_pass`中使用了以斜杠结尾的URL,Nginx会自动将`location`中匹配的路径部分(即`/web/`)从原始URI中去除,然后将剩余部分拼接到`proxy_pass`的URL后面。因此,配置如下:```nginxserver{listen80;server_nameyour_domain.com;#替换为你的域名或IP#配置第一个反向代理:/sso/路径location/sso/{proxy_passhttp://10.251.22.122:8700/sso/;#注意末尾的斜杠#可以添加其他代理设置,如设置头信息proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Proto$scheme;}#配置第二个反向代理:/web/路径location/web/{proxy_passhttp://10.251.22.248:80/;#注意末尾的斜杠proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Proto$scheme;}#其他配置...}```注意:1.在`proxy_pass`指令中,如果目标URL包含路径(如`http://.../sso/`),并且以斜杠结尾,那么Nginx会将匹配到的`location`路径(即`/sso/`)从原始请求中移除,然后将剩余部分附加到目标URL后面。2.如果目标URL不以斜杠结尾,则不会移除`location`匹配的路径部分。例如,如果写成`proxy_passhttp://10.251.22.122:8700;`(没有`/sso/`),那么请求`/sso/login`会被代理到`http://10.251.22.122:8700/sso/login`,这可能不是我们想要的效果(因为第一个需求要求代理到`/sso/`路径下,所以这样写也可以,但要注意后端服务的路径是否匹配)。但是根据需求,我们明确要代理到`http://10.251.22.122:8700/sso/`,所以第一种写法更符合要求。另外,为了确保代理正常工作,我们设置了一些常用的头信息,以便后端服务器能够获取真实的客户端IP等信息。配置完成后,需要重新加载Nginx配置:```bashnginx-sreload```请根据实际环境调整配置,例如`server_name`监听的端口(这里监听80端口)。如果遇到问题,可以检查Nginx错误日志(通常位于`/var/log/nginx/error.log`)来排查。§§相关问题§§1.如何配置Nginx反向代理以保留原始请求的路径?2.Nginx反向代理常见配置参数有哪些?3.如何为Nginx反向代理添加SSL/TLS加密?</think>### Nginx 反向代理配置指南 根据你的需求,需要配置两个路径的反向代理规则。以下是完整的 Nginx 配置方案: ```nginx server { listen 80; server_name your-domain.com; # 替换为你的域名或IP # /sso/ 路径代理配置 location /sso/ { proxy_pass http://10.251.22.122:8700/sso/; # 注意末尾斜杠 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # /web/ 路径代理配置 location /web/ { proxy_pass http://10.251.22.248:80/; # 注意末尾斜杠 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 可选的默认处理 location / { return 404; # 其他路径返回404 } } ``` #### 配置说明: 1. **路径匹配规则**: - `/sso/` → 匹配所有以 `/sso/` 开头的请求 - `/web/` → 匹配所有以 `/web/` 开头的请求 - **注意**:末尾斜杠 `/` 确保精确路径匹配 2. **关键参数**: - `proxy_pass`:指定后端服务地址 - `proxy_set_header`:传递客户端原始信息到后端 - `$host`:保留原始请求的域名 - `$remote_addr`:保留客户端真实IP 3. **斜杠重要性**: - `proxy_pass http://10.251.22.122:8700/sso/` 中的末尾斜杠 - 请求 `/sso/login` → 代理到 `http://10.251.22.122:8700/sso/login` - 若去掉末尾斜杠:`/sso/login` → `http://10.251.22.122:8700/sso/login`(多出重复路径) #### 验证与重载步骤: 1. 保存配置文件(如 `/etc/nginx/conf.d/proxy.conf`) 2. 测试配置语法: ```bash nginx -t ``` 3. 重载配置生效: ```bash nginx -s reload ``` #### 常见问题排查: 1. **502 Bad Gateway**: - 检查后端服务是否运行:`curl http://10.251.22.122:8700/sso/health` - 检查防火墙规则是否开放端口 2. **路径不匹配**: - 确认请求是否包含多余斜杠:`/sso` ≠ `/sso/` - 使用精确匹配模式:`location = /sso/ { ... }` 3. **Header 丢失**: - 在后端应用日志中检查 `X-Forwarded-For` 头是否存在 - 添加更多代理头: ```nginx proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; ``` 此配置实现了路径级别的精确反向代理,同时保留了客户端的原始请求信息[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值