Назад | Перейти на главную страницу

При проксировании 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 info@example.net
</VirtualHost>

До сих пор все работало нормально, но я добавил на сайт скрипт PHP (не свой собственный), и он не может получить правильное имя хоста. Либо $ _SERVER ["HTTP_HOST"], и / или $ _SERVER ['SERVER_NAME']] возвращают localhost: 8100 вместо example.com.

Можно ли настроить это так, чтобы PHP получал правильное имя хоста?

По умолчанию он отправляет спецификацию хоста из proxy_pass линия. Вы можете переопределить это, добавив туда эту конфигурацию, заставив Host: заголовок должен содержать то же, что и отправленный клиентом:

proxy_set_header Host $host;

Обходной путь - изменить 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 (внутренне). Но ответ Шейна, конечно, лучше.