我用Nginx > Varnish > Apache,php-fpm在 Centos WebPanel 中。
ERR_TOO_MANY_REDIRECTS
只出现在 Wordpress 主页上,然后消失,然后又回到我的网站上。这种周期性行为表明这是一个与缓存相关的问题。
Status 301 Moved Permanently
Server nginx/1.16.1
Date Mon, 24 Feb 2020 15:46:29 GMT
Content-Type text/html; charset=iso-8859-1
Content-Length 230
Connection keep-alive
Keep-Alive timeout=60
Location https://thinkbalm.com/
X-Varnish 98379 131369
Age 13
Via 1.1 varnish (Varnish/5.2)
X-Cache HIT from Backend
将域的配置设置为Nginx > Apache,因此取出 Varnish 解决了问题,但是我丢失了 Varnish 缓存。因此我进行了大量搜索,问题似乎是以下几点:
Varnish 和 SSL - HTTPS 终止代理背后的 WordPress
不幸的是,Varnish 不支持 SSL。所以我们需要终止 SSL 连接,并使用纯 HTTP 与 Varnish 和您的 WordPress 网站通信。
Varnish 不仅不支持 SSL,而且还不知道 SSL 终止,仅使用主机名和请求的 URL 作为标识符。
我们触发了一个问题:在不知道初始请求协议的应用程序上强制 HTTPS 重定向,可能会导致ERR_TOO_MANY_REDIRECTS
浏览器出现错误。
当页面的 HTTP 版本存储在缓存中时,就会发生这种情况。输出只不过是 301 重定向到 HTTPS 版本。但由于 Varnish 和 WordPress 不知道 SSL 终止,因此您最终会陷入重定向循环,直到浏览器抛出此错误。
我们怎样才能解决这个问题?
我尝试将其添加到wp-config
文件中:
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
}
我还尝试将其添加到.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>
但这些都未能解决问题。
有任何想法吗?
答案1
整个解决方案,我曾写过一篇博客文章,取决于标题的存在X-Forwarded-Proto
。
- 如果没有它,则
HTTPS
无法在 Apache 中设置环境变量。 - 如果没有它,Varnish 就无法执行缓存变化
我最初的假设是这个标头没有正确设置。但有一个简单的方法可以找出答案:
请将以下 Varnish 命令的输出发送给我:
varnishlog -g request -q "ReqUrl eq '/'"`
我假设这发生在主页上,因此命令会过滤主页上的请求。
请确认您是否有影响sub vcl_hash
缓存变化方式的自定义配置。