如何阻止使用 nginx 和 apache 的 varnish 上的 wordpress 站点通过 http 加载?

How can I stop wordpress sites on varnish with nginx and apache from loading via http?

我有一个新的服务器配置: 端口 80 上的 varinsh(配置为将直接请求重定向到 443) 端口 443 上的 nginx(转发到 varnish) 8080 上的 apache(这里安装了 wordpress)

当我加载 wordpress 站点时,所有 js 文件都试图在 80 上加载并且不安全。

Wordpress 设置为覆盖 WP_HOME 和 WP_SITEURL 到 https://example.com

我发现一篇文章说我需要这样做: (nginx) proxy_set_header X-Forwarded-Proto $方案; 然后在您的 apache vhost 配置中: SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on

我已经做了,但没有效果。

几年前我写了一篇关于这个主题的博客 post。请看:https://feryn.eu/blog/mixed-content-and-err-too-many-redirects-in-wordpress/

当然我也会把相关配置放在这里

Nginx 配置

Nginx 充当您的 TLS 终止点,但它向 Varnish 发送纯 HTTP 请求。

您需要通过 Varnish 和 Apache 发送 X-Forwarded-Proto header,让它们都知道所使用的协议。

您可以将以下行添加到 Nginx 配置中的代理逻辑中:

proxy_set_header X-Forwarded-Proto $scheme;

Apache 配置

Apache 将处理此 X-Forwarded-Proto 并在值不是 HTTPS 时执行重定向。

如果需要,可以将下面的代码片段放入 .htaccess 文件中:

SetEnvIf X-Forwarded-Proto "https" HTTPS=on
Header append Vary: X-Forwarded-Proto

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

简要说明其作用:

  • 检查 X-Forwarded-Proto
  • 的值
  • 如果 X-Forwarded-Proto 等于 HTTPS
  • ,则将环​​境变量 HTTPS 设置为 ON
  • 设置自定义 Vary: X-Forwarded-Proto header (Varnish 需要)
  • 如果 HTTPS 不是 OnX-Forwarded-Proto 不是 HTTPS
  • ,则执行 HTTPS 重定向

清漆呢?

默认情况下,Varnish 没有协议意识。您可以编写一些 VCL 来实现这一点,但幸运的是,HTTP 协议具有使用 HTTP headers.

实现这一点所需的语义。

在前面关于 Apache 配置的部分中,我提到了 Vary: X-Forwarded-Proto。这就是 Varnish 区分 HTTP 和 HTTPS 内容所需要的。

如果不是这个 Vary header,Varnish 会缓存首先调用的内容,这可能导致混合内容被缓存。

A Vary 告诉 Varnish 为 X-Forwarded-Proto 的每个值创建一个缓存变体。这会将 HTTP 内容与 HTTPS 内容分开,并导致在缓存页面上使用正确的 URL 方案。