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

Jan*_*mer 3 nginx hostname apache-2.2

我遇到了多个网站共享一个 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 httpd.conf 中,我们有

<VirtualHost localhost:8100>
    ServerName www.example.com
    ServerAlias example.com
    Options Indexes
    DocumentRoot /export/sites/example/live
    ServerAdmin info@example.net
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都运行良好,但我已经向站点添加了一个 PHP 脚本(不是我自己的),但它无法获得正确的主机名。$_SERVER["HTTP_HOST"] 和/或 $_SERVER['SERVER_NAME'] 正在返回 localhost:8100 而不是 example.com。

是否可以进行设置以便 PHP 获得正确的主机名?

Sha*_*den 8

默认情况下,它从proxy_pass线路发送主机规范。您可以通过在其中抛出此配置来覆盖它,强制Host:标头包含与客户端发送的相同:

proxy_set_header Host $host;
Run Code Online (Sandbox Code Playgroud)