我有一个新的服务器,配置为: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作为你的TLS终止点,但它向Varnish发送普通的HTTP请求。
你需要发送一个 X-Forwarded-Proto
通过Varnish和Apache的头,让他们知道使用了什么协议。
你可以在Nginx配置中添加以下一行到你的代理逻辑中。
proxy_set_header X-Forwarded-Proto $scheme;
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
HTTPS
到 ON
如果 X-Forwarded-Proto
等于 HTTPS
Vary: X-Forwarded-Proto header
(上光油需要)HTTPS
不是 On
和 X-Forwarded-Proto
不是 HTTPS
默认情况下,Varnish没有协议意识。你可以写一些VCL来实现这一点,但幸运的是,HTTP协议具有所需的语义,可以使用HTTP头文件实现这一点。
在上一节关于Apache配置的内容中,我提到了以下内容 Vary: X-Forwarded-Proto
. 这就是Varnish需要区分HTTP & HTTPS内容的原因。
如果不是因为这个 Vary
头,Varnish会先缓存任何被调用的内容,这可能导致混合内容被缓存。
A Vary
告诉Varnish为每个值的 X-Forwarded-Proto
. 这将分离HTTP内容和HTTPS内容,并将导致正确的URL方案用于缓存页面。