我有一个大致如下所示的设置(我已尝试尽可能简化它):
端口 443 - nginx 监听并转发到端口 80,配置如下
server {
listen 443 ssl;
location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
}
端口 80 - Varnish(反向代理)将流量转发到端口 8080,除非出现缓存命中。
使用 fastcgi 为 PHP 设置端口 8080 nginx。我有一些常用配置:
location ~ \.php$ {
...
include fastcgi_params;
}
和 fastcgi_params 文件如下所示
...
fastcgi_param HTTPS $https if_not_empty;
我一直在尝试创建一个设置,其中 nginx 在监听端口 8080 时能够检测它是否正在向 http 或 https 提供内容。它需要将此告知 PHP,以便它可以创建具有正确方案的 URL。
我在想我应该在某个地方监听X-Forwarded-Proto
,然后告诉 nginx https 已打开。我不知道如何/在哪里创建某种 if 语句,或者这样的事情是否可能,或者如何告诉 nginx https 应该打开。
答案1
您可以通过两种方式解决这个问题...在应用程序级别或在 Nginx 级别。
在应用程序级别
因为它是一个 PHP 应用程序,所以您可以在代码/应用程序的顶部使用以下内容...
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on';
在 Nginx 级别
步骤1:将 X-Forwarded-Proto 映射到一个变量,该变量的值依赖于 X-Forwarded-Proto。
map $http_x_forwarded_proto $fastcgi_param_https_variable {
default '';
https 'on';
}
第2步:将现有行替换fastcgi_param HTTPS $https $if_not_empty
为以下行,该行根据上述变量设置 fastcgi_param HTTPS
fastcgi_param HTTPS $fastcgi_param_https_variable;
我个人更喜欢第一种方法,因为它只需要一行代码就可以正确设置。第二种方法应该也可以,但尚未测试。