Nginx - 如何在反向代理后面为 PHP 启用 ssl

goo*_*orp 5 ssl nginx reverse-proxy

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

端口 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;
}
Run Code Online (Sandbox Code Playgroud)

端口 80 - Varnish(反向代理)将流量转发到端口 8080,除非缓存命中。

使用 fastcgi 为 PHP 设置端口 8080 nginx。我有一些常见的配置:

location ~ \.php$ {
  ...
  include fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)

和 fastcgi_params 文件,看起来像这样

...
fastcgi_param   HTTPS           $https if_not_empty;
Run Code Online (Sandbox Code Playgroud)

我一直在尝试做的是创建一个设置,其中 nginx 在侦听端口 8080 时能够检测到它是否正在向 http 或 https 提供内容。它需要将此告诉 PHP,以便它可以使用正确的方案创建 URL。

我在想我应该在某个地方监听X-Forwarded-Proto然后告诉 nginx https 已打开。我不知道如何/在哪里做某种 if 语句,或者这样的事情是否可能,或者如何告诉 nginx https 应该打开。

Pot*_*thu 8

您可以通过两种方式解决这个问题……在应用程序级别或在 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';
}
Run Code Online (Sandbox Code Playgroud)

第 2 步:使用fastcgi_param HTTPS $https $if_not_empty以下基于上述变量设置 fastcgi_param HTTPS 的行替换现有行

fastcgi_param HTTPS $fastcgi_param_https_variable;

就个人而言,我更喜欢第一种方法,因为它只需要一行代码即可正确设置。第二种方法也应该有效,但没有经过测试。

  • 重要的提示!`map` 指令必须位于 `http` 指令的根目录中(通常位于 `/etc/nginx/nginx.conf` 中)。否则Nginx将无法加载配置。 (2认同)