由于我是 nginx 代理的初学者,所以我有一个问题。
其要点: nginx 代理在哪里为 php 的 $_SERVER["HTTP_X_FORWARDED_HOST"]、 $_SERVER["HTTP_X_FORWARDED_SERVER"] 和 $_SERVER["HTTP_X_FORWARDED_FOR"]
设置默认值?
更多信息:
这是一个开发环境。
我的 nginx 代理上有一个 vhost 条目:
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 [email protected]
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>
在我本地机器的 hosts 文件中我添加了服务器:
...
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;
}
}
但结果输出仍然相同。
我整天都在谷歌搜索为什么会出现这种情况。
nginx 的 proxy_set_header 文档状态:
该指令允许重新定义并添加一些将被传输到代理服务器的请求标头行。
我想知道为什么它恰好说“重新定义”。我没有找到关于这里预定义的内容以通过 proxy_set_header 重新定义的答案。
我已经在 /etc/nginx/nginx.conf 中搜索了 proxy_set_header,实际上我用以下方法搜索了整个 /etc/nginx 目录
grep -ri x-forwarded-host *
仅在 sites-available 和 sites-enabled 中找到结果。
我在 apache 网络服务器上搜索了相同的内容,但没有找到有用的结果(我认为它们可能是在 php 代码中设置的,但我错了)。
我怀疑我的 nginx vhost 文件是否是使用过的文件。
感谢您的时间。
总结:
nginx 代理在哪里设置 php 的
$_SERVER["HTTP_X_FORWARDED_HOST"]、
$_SERVER["HTTP_X_FORWARDED_SERVER"] 和
$_SERVER["HTTP_X_FORWARDED_FOR"] 的默认值?
答案1
事实证明,我首选的重新加载 nginx 配置的方法已损坏:
/etc/init.d/nginx reload
它只是没有重新加载配置。
重新启动代理后,它就可以按预期工作了。
直接通过二进制文件重新加载也可以:
nginx -s reload
我不知道为什么会这样所以我要问另一个问题。