我遇到过这种情况:多个网站共享一个 IP 地址。我使用 nginx 接受请求并将其传递给 Apache,后者实际上为这些网站提供服务。我知道这里实际上不需要 Apache,但由于历史原因,它是这样设置的,如果没有必要,我宁愿不更改它。
按照设置方式,nginx 接受对 example.com 的请求并将其传递给 Apache,如下所示:
server {
listen 80;
server_name example.com www.example.com;
access_log /var/log/nginx/example.log;
error_log /var/log/nginx/example.log;
location / {
proxy_read_timeout 120;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8100;
}
}
在 httpd.conf 中,我们有
<VirtualHost localhost:8100>
ServerName www.example.com
ServerAlias example.com
Options Indexes
DocumentRoot /export/sites/example/live
ServerAdmin [email protected]
</VirtualHost>
到目前为止一切都运行良好,但我向网站添加了一个 PHP 脚本(不是我自己的),但它无法获取正确的主机名。$_SERVER["HTTP_HOST"] 和/或 $_SERVER['SERVER_NAME'] 返回的是 localhost:8100,而不是 example.com。
是否可以进行设置以便 PHP 获取正确的主机名?
答案1
默认情况下,它会从线路发送主机规范proxy_pass
。您可以通过添加此配置来覆盖此配置,强制Host:
标头包含与客户端发送的相同的内容:
proxy_set_header Host $host;
答案2
一个解决方法是将 nginx 改为:
location / {
proxy_read_timeout 120;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://www.example.com:8100;
}
然后修改 /etc/hosts,使 www.example.com 和 example.com 都指向 127.0.0.1(内部)。当然,Shane 的答案更好。