9阅网

您现在的位置是:首页 > 知识 > 正文

知识

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

admin2022-11-07知识18

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

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

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

我找到一篇文章,说我需要这样做:(nginx) proxy_set_header X-Forwarded-Proto $scheme;然后在你的apache vhost配置中:SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on。

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



【回答】:

几年前我写过一篇关于这个问题的博客文章。请看一下。https:/feryn.eublogmixed-content-and-err-too-many-redirects-wordpress。

当然我也要把相关的配置放在这里。

Nginx配置

Nginx作为你的TLS终止点,但它向Varnish发送普通的HTTP请求。

你需要发送一个 X-Forwarded-Proto 通过Varnish和Apache的头,让他们知道使用了什么协议。

你可以在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
  • 设置环境变量 HTTPSON 如果 X-Forwarded-Proto 等于 HTTPS
  • 设置一个自定义 Vary: X-Forwarded-Proto header (上光油需要)
  • 在HTTPS重定向上,如果 HTTPS 不是 OnX-Forwarded-Proto 不是 HTTPS

那Varnish呢?

默认情况下,Varnish没有协议意识。你可以写一些VCL来实现这一点,但幸运的是,HTTP协议具有所需的语义,可以使用HTTP头文件实现这一点。

在上一节关于Apache配置的内容中,我提到了以下内容 Vary: X-Forwarded-Proto. 这就是Varnish需要区分HTTP & HTTPS内容的原因。

如果不是因为这个 Vary 头,Varnish会先缓存任何被调用的内容,这可能导致混合内容被缓存。

A Vary 告诉Varnish为每个值的 X-Forwarded-Proto. 这将分离HTTP内容和HTTPS内容,并将导致正确的URL方案用于缓存页面。