Nginx中$http_host$host$proxy_host的区别
Posted hopeless-dream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx中$http_host$host$proxy_host的区别相关的知识,希望对你有一定的参考价值。
变量 | 是否显示端口 | 值是否存在 |
host | 否 |
"Host:value"显示 值为a:b的时候,只显示a |
http_host | 是 | "Host:value",value存在就显示 |
proxy_host |
默认80不显示 其他端口显示 |
"Host:value"显示 |
通过nginx配置演示:
[root@ans3 conf]# cat nginx.conf #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ ‘$status $body_bytes_sent "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘; access_log logs/access.log main; sendfile on; tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # upstream backend { # server 10.0.0.50:8080; #} server { listen 80; server_name a.test.com; location / { proxy_pass http://10.0.0.50:8080; proxy_set_header X-Proxy-Host $proxy_host; proxy_set_header Host $http_host; index index.html index.htm; } } }
另一台服务器配置
[root@master conf]# cat nginx.conf #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ # ‘$status $body_bytes_sent "$http_referer" ‘ # ‘"$http_user_agent" "$http_x_forwarded_for"‘; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 8080; server_name www.test.com aa.test.com; location / { return 200 ‘http_host=[$http_host] host=[$host] proxy_host=[$http_x_proxy_host] ‘; } } }
不携带请求头 Host
[root@ans3 conf]# curl -H ‘Host:‘ --http1.0 http://a.test.com
http_host=[] host=[www.test.com] proxy_host=[10.0.0.50:8080]
变量 | 值 | 说明 |
---|---|---|
http_host | 请求无 Host, 则 http_host 为空, 继而无 Host 传到 proxy | |
host | www.test.com | proxy 无 Host 传入, 则使用其 server_name 的第一项 |
proxy_host |
10.0.0.50:8080 |
取自于 proxy_pass 的参数 |
携带请求头 Host
[root@ans3 conf]# curl -H ‘Host:abc:123‘ --http1.0 http://a.test.com
http_host=[abc:123] host=[abc] proxy_host=[10.0.0.50:8080]
变量 | 值 | 说明 |
---|---|---|
http_host | abc:123 | 给啥拿啥 |
host | abc | 第一个: 前的内容(小写) |
proxy_host |
10.0.0.50:8080 |
带端口显示 |
修改真实服务器的端口为默认端口
http { include mime.types; default_type application/octet-stream; log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ ‘$status $body_bytes_sent "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘; access_log logs/access.log main; sendfile on; tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # upstream backend { # server 10.0.0.50:8080; #} server { listen 80; server_name a.test.com; location / { proxy_pass http://10.0.0.50:80; proxy_set_header X-Proxy-Host $proxy_host; proxy_set_header Host $http_host; index index.html index.htm; } } }
http { include mime.types; default_type application/octet-stream; #log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ # ‘$status $body_bytes_sent "$http_referer" ‘ # ‘"$http_user_agent" "$http_x_forwarded_for"‘; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name www.test.com aa.test.com; location / { return 200 ‘http_host=[$http_host] host=[$host] proxy_host=[$http_x_proxy_host] ‘; } } }
访问时proxy_host会省略80端口
[root@ans3 conf]# curl -H ‘Host:abc:123‘ --http1.0 http://a.test.com
http_host=[abc:123] host=[abc] proxy_host=[10.0.0.50]
以上是关于Nginx中$http_host$host$proxy_host的区别的主要内容,如果未能解决你的问题,请参考以下文章
Nginx中$http_host$host$proxy_host的区别
nginx 之$proxy_host|$host|$http_host区别
Nginx反向代理导致PHP获取不到正确的HTTP_HOST,SERVER_NAME,客户端IP的解决方法