Varnish 301重定向循环Wordpress网站

Varnish 301重定向循环Wordpress网站,wordpress,redirect,varnish,Wordpress,Redirect,Varnish,每隔几个小时,就有一个重定向循环到站点本身的域,它只发生在我的一个wordpress站点上 问题源于wordpress插件,它被错误地设置为在管理员注销时将站点重定向到域本身 在执行此301重定向后,站点仅在管理员未登录时停止工作,因为站点尝试一次又一次地重定向到自身 为了修复这个问题,我删除了插件中的重定向条件,之后删除了插件本身并清除Varnish缓存,然后重定向被清除,站点开始正常工作,直到几个小时后Varnish再次缓存301重定向循环到域本身,所以为了解决这个问题,我需要每隔几个小时清

每隔几个小时,就有一个重定向循环到站点本身的域,它只发生在我的一个wordpress站点上

问题源于wordpress插件,它被错误地设置为在管理员注销时将站点重定向到域本身

在执行此301重定向后,站点仅在管理员未登录时停止工作,因为站点尝试一次又一次地重定向到自身

为了修复这个问题,我删除了插件中的重定向条件,之后删除了插件本身并清除Varnish缓存,然后重定向被清除,站点开始正常工作,直到几个小时后Varnish再次缓存301重定向循环到域本身,所以为了解决这个问题,我需要每隔几个小时清除Varnish

在删除发布的插件后,我扫描了wordpress文件夹中的所有文件,扫描了所有wordpress数据库以找到重定向规则,我没有发现它的踪迹,这简直是疯了

重定向规则还可以保存在其他什么地方,以便一次又一次地缓存它

此外:

我的etc/varnish/default.vcl:

etc/清漆/清漆参数:

/etc/varnish/conf.d/vhosts/MYSITE.COM.conf:


您可能正在经历的是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标头 您需要确保TLS终止软件公开
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配置文件代码,你能看看它们是否设置正确吗?