Varnish ERR_TOO_MANY_REDIRECTS

Varnish ERR_TOO_MANY_REDIRECTS

我用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缓存变化方式的自定义配置。

相关内容