在应用程序级别

在应用程序级别

我有一个大致如下所示的设置(我已尝试尽可能简化它):

端口 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;

我个人更喜欢第一种方法,因为它只需要一行代码就可以正确设置。第二种方法应该也可以,但尚未测试。

相关内容