使用 Nginx 代理 Apache,真实主机名丢失

使用 Nginx 代理 Apache,真实主机名丢失

我遇到过这种情况:多个网站共享一个 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 的答案更好。

相关内容