Apache-2.2

nginx proxy_set_header x-forwarded-proto 似乎不起作用

  • March 2, 2016

由於我是 nginx 代理的初學者,我有一個問題。

它的要點:

nginx 代理在哪里為 php 設置預設值

$ _SERVER[“HTTP_X_FORWARDED_HOST”], $ _伺服器

$$ “HTTP_X_FORWARDED_SERVER” $$和

$_SERVER$$ “HTTP_X_FORWARDED_FOR” $$? 更多資訊:

這是一個開發環境。

我的 nginx 代理上有一個虛擬主機條目:

server {
   listen 192.168.1.17:443 ssl;
   server_name foo.bar.com;

   ssl_certificate /etc/nginx/ssl/boerse.de.crt;
   ssl_certificate_key /etc/nginx/ssl/boerse.de.key;

   location / {
       proxy_pass http://foo_cluster/;

       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
   }
}

foo_cluster 僅上游一台伺服器:

upstream foo_cluster {
   ip_hash;
   server 192.168.5.33:80 fail_timeout=30s;
   server 192.168.5.34:80 fail_timeout=30s down;
}

在我位於 192.168.5.33 的 apache 網路伺服器上,我有另一個虛擬主機:

<VirtualHost *:80>
   ServerName foo.bar.com
   ServerAdmin webmaster@bar.com
   DocumentRoot /var/www/foo-bar-com
   <Directory /var/www/foo-bar-com/>
           Options Indexes FollowSymLinks MultiViews
           AllowOverride ALL
           Order allow,deny
           allow from all
   </Directory>

   LogLevel warn
   ErrorLog /var/log/apache2/foo.bar.com_error.log
   CustomLog /var/log/apache2/foo.bar.com_access.log combined

   ServerSignature On
   SetEnv ApplicationConfigFiles "/var/ApplicationConfigFiles/"

   php_value include_path ".:/var/www/baz/global/php/base:/var/www/foo-bar-com/vendor/library/:/var/www/foo-bar-com/vendor/models/model/:"
   php_value auto_prepend_file /var/www/foo-bar-com/class/functions/prepend.php
   php_value auto_append_file /var/www/foo-bar-com/class/functions/append.php
</VirtualHost>

在我本地機器上的主機文件中,我添加了伺服器:

...
192.168.1.17 foo.bar.com
...

在我的 prepend.php 中,我只輸出超全域 $_SERVER 並停止:

<?php
   var_dump($_SERVER); exit;
   ...

好的。現在完成所有設置後,我在瀏覽器上打開網站https://foo.bar.com

這裡是輸出原始碼的摘錄:

array(32) {
   ...
   ["HTTP_HOST"]=>
   string(11) "foo.bar.com"
   ["HTTP_X_FORWARDED_HOST"]=>
   string(11) "foo.bar.com"
   ["HTTP_X_FORWARDED_SERVER"]=>
   string(11) "foo.bar.com"
   ["HTTP_X_FORWARDED_FOR"]=>
   string(13) "192.168.2.131"
   ["HTTP_CONNECTION"]=>
   string(5) "close"
   ...

由於我缺少預期的 X-Forwarded-Proto,我註釋掉了 nginx vhost 文件中的所有 proxy_set_header(並重新載入服務):

server {
   listen 192.168.1.17:443 ssl;
   server_name foo.bar.com;

   ssl_certificate /etc/nginx/ssl/boerse.de.crt;
   ssl_certificate_key /etc/nginx/ssl/boerse.de.key;

   location / {
       proxy_pass http://foo_cluster/;

       #proxy_set_header Host $host;
       #proxy_set_header X-Forwarded-Host $host;
       #proxy_set_header X-Forwarded-Server $host;
       #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       #proxy_set_header X-Forwarded-Proto $scheme;
   }
}

然而,結果輸出保持不變。

我已經在Google上搜尋了為什麼整天都會出現這種情況。

proxy_set_header 的 nginx 文件指出:

該指令允許重新定義和添加一些將傳輸到代理伺服器的請求標頭行。

我想知道為什麼它說完全“重新定義”。我沒有找到關於這裡預定義的內容要通過 proxy_set_header 重新定義的答案。

我已經在 /etc/nginx/nginx.conf 中搜尋了 proxy_set_header,實際上我使用了整個 /etc/nginx 目錄

grep -ri x-forwarded-host *

僅在站點可用和站點啟用的位置找到結果。

我在 apache 網路伺服器上搜尋了相同的結果,但沒有有用的結果(我認為它們可能是在 php 程式碼中設置的,但我錯了)。

我懷疑我的 nginx vhost 文件是否是使用過的。

感謝您的時間。

Tldr:

nginx 代理在哪里為 php 設置預設值

$ _SERVER[“HTTP_X_FORWARDED_HOST”], $ _伺服器

$$ “HTTP_X_FORWARDED_SERVER” $$和

$_SERVER$$ “HTTP_X_FORWARDED_FOR” $$?

事實證明,我重新載入 nginx 配置的首選方法已損壞:

/etc/init.d/nginx reload

它只是沒有重新載入配置。

重新啟動代理後,它按預期工作。

也可以直接通過二進製文件重新載入:

nginx -s reload

我不知道為什麼會這樣,所以我要問另一個問題。

引用自:https://serverfault.com/questions/624467