如何阻止使用 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
不是 On
且 X-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 方案。
我有一个新的服务器配置: 端口 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
,则将环境变量 - 设置自定义
Vary: X-Forwarded-Proto header
(Varnish 需要) - 如果
HTTPS
不是On
且X-Forwarded-Proto
不是HTTPS
,则执行 HTTPS 重定向
HTTPS
设置为 ON
清漆呢?
默认情况下,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 方案。