Varnish 301重定向循环Wordpress网站
每隔几个小时,就有一个重定向循环到站点本身的域,它只发生在我的一个wordpress站点上 问题源于wordpress插件,它被错误地设置为在管理员注销时将站点重定向到域本身 在执行此301重定向后,站点仅在管理员未登录时停止工作,因为站点尝试一次又一次地重定向到自身 为了修复这个问题,我删除了插件中的重定向条件,之后删除了插件本身并清除Varnish缓存,然后重定向被清除,站点开始正常工作,直到几个小时后Varnish再次缓存301重定向循环到域本身,所以为了解决这个问题,我需要每隔几个小时清除Varnish 在删除发布的插件后,我扫描了wordpress文件夹中的所有文件,扫描了所有wordpress数据库以找到重定向规则,我没有发现它的踪迹,这简直是疯了 重定向规则还可以保存在其他什么地方,以便一次又一次地缓存它 此外: 我的etc/varnish/default.vcl: etc/清漆/清漆参数: /etc/varnish/conf.d/vhosts/MYSITE.COM.conf:Varnish 301重定向循环Wordpress网站,wordpress,redirect,varnish,Wordpress,Redirect,Varnish,每隔几个小时,就有一个重定向循环到站点本身的域,它只发生在我的一个wordpress站点上 问题源于wordpress插件,它被错误地设置为在管理员注销时将站点重定向到域本身 在执行此301重定向后,站点仅在管理员未登录时停止工作,因为站点尝试一次又一次地重定向到自身 为了修复这个问题,我删除了插件中的重定向条件,之后删除了插件本身并清除Varnish缓存,然后重定向被清除,站点开始正常工作,直到几个小时后Varnish再次缓存301重定向循环到域本身,所以为了解决这个问题,我需要每隔几个小时清
您可能正在经历的是Varnish缓存WordPress页面的HTTP版本,而不考虑请求方案 我写了一篇关于它的博客: 发生什么事? WordPress将为超媒体内容(如图像、CSS、Javascript等)创建URL。如果在PHP中设置了
HTTPS=on
superglobal,则将使用HTTPS://
方案,否则将使用http
方案
当WordPress站点仅为HTTPS时,将发生301重定向,将http://
请求重定向到HTTPS://
请求
问题是Varnish仅限于HTTP,来自Varnish的所有请求都将导致重定向
诀窍是通过X-Forwarded-Proto
头公开原始协议,并确保您的Web服务器(Apache或Nginx)考虑到这一点
您可能会面临的另一个问题是,如果没有适当的缓存变体,重定向可能会被缓存
要避免这些问题,需要做两件事:
- 让您的WordPress安装程序了解原始协议
- 在协议的清漆中创建缓存变体
X-Forwarded-Proto:https
标题。这样,WordPress将根据该值知道应该使用哪个URL方案
对于直接进入Varnish的普通HTTP连接,可以使用以下代码段设置X-Forwarded-Proto:HTTP
:
vcl 4.0;
sub vcl_recv {
if(!req.http.X-Forwarded-Proto) {
set req.http.X-Forwarded-Proto = "http";
}
}
本例假设您正在使用第7层TLS终端软件,如Nginx、HaProxy或任何其他应用程序负载平衡器
阿帕奇
如果您使用的是Apache,则可以使用以下配置语法添加Vary:X-Forwarded-Proto
:
SetEnvIf X-Forwarded-Proto "https" HTTPS=on
Header append Vary: X-Forwarded-Proto
add_header Vary X-Forwarded-Proto;
这将设置WordPress用于确定方案的HTTP=on
环境变量。这是基于X-Forwarded-Proto
在响应端,设置了Vary:X-Forwarded-Proto
,Varnish使用它为每个方案创建缓存变体
Nginx
如果您使用的是Nginx,则可以使用以下配置语法添加Vary:X-Forwarded-Proto
:
SetEnvIf X-Forwarded-Proto "https" HTTPS=on
Header append Vary: X-Forwarded-Proto
add_header Vary X-Forwarded-Proto;
但当然,您需要确保PHP从Nginx获得适当的HTTPS
环境变量
我们可以基于$http\u x\u proto
映射$fastcgi\u https
变量的值,如下所示:
map $http_x_forwarded_proto $fastcgi_https {
default '';
https on;
}
fastcgi_param HTTPS $fastcgi_https;
然后只需将HTTPS
FastCGI参数设置为location~\.php${}
块中的$FastCGI\u HTTPS
值,如下所示:
map $http_x_forwarded_proto $fastcgi_https {
default '';
https on;
}
fastcgi_param HTTPS $fastcgi_https;
谢谢你的详细回答!我现在不确定我以前写的是什么,因为我注意到一个有问题的wordpress varnish缓存插件“wp super cache”,该插件使varnish缓存处于禁用状态,因此在清除缓存或删除该插件后,301重定向消失。我现在使用的是另一个varnish缓存插件,没有这个问题。我添加了我的服务器varnish配置文件代码,你能看看它们是否设置正确吗?