Apache-2.4

wordpress ERR_TOO_MANY_REDIRECTS 通過清漆,但不通過 apache

  • September 9, 2020

我在使用 varnish-wordpress 設置時遇到了這個奇怪的問題。當我嘗試通過清漆轉移流量時,我得到了 TOO_MANY_REDIRECTS,但是如果我直接配置 apache 並使用一個在 443 上監聽的虛擬主機,它就可以正常工作。清漆中 default.vcl 的相關部分:

   if (std.port(local.ip) == 80 && req.http.host ~ "example.com(:[0-9]+)?$") {
   set req.http.x-redir = "https://" + req.http.host + req.url;
   return(synth(850, "Moved permanently"));

   [...]


  else if (req.http.host ~ "(www\.)?example.com(:[0-9]+)?$") {
   set req.backend_hint = web227;
       return (pipe);
       }
sub vcl_synth {
   if (resp.status == 850) {
       set resp.http.Location = req.http.x-redir;
       set resp.status = 301;
       return (deliver);
   }

我暫時使用管道,以確保在我仍在測試的這個階段不會遇到更多記憶體。

在這個清漆上,有幾個 wordpress 後端可以正常工作,相同的 .htaccess 駐留在其上,“經典”wordpress .htaccess:

   <IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

這是我的 apache 站點配置:

<VirtualHost *:80>
       ServerAdmin user@example.com
       ServerName  digital.ringier.ro
       ErrorLog "/var/log/apache2/example.com.error.log"
       CustomLog "/var/log/apache2/example.com.access.log" common
       #Redirect / https://example.com/
       DocumentRoot "/var/www/example.com"
       <Directory "/var/www/example.com">
       AllowOverride all
       Options -Indexes +FollowSymLinks +MultiViews
       </Directory>
</VirtualHost>

<VirtualHost *:443>
       ServerAdmin user@example.com
       ServerName  example.com
       DocumentRoot "/var/www/example.com"
       <Directory "/var/www/example.com">
       AllowOverride all
       Options -Indexes +FollowSymLinks +MultiViews
       </Directory>
       ErrorLog "/var/log/apache2/example.com.error.log"
       CustomLog "/var/log/apache2/example.com.access.log" common
       SSLEngine on
       SSLCertificateFile /etc/apache2/ssl/apache.crt
       SSLCertificateKeyFile /etc/apache2/ssl/apache.key
</VirtualHost>

對於我的生活,我無法理解為什麼當我直接訪問 apache 時它會起作用(我正在更改主機中的 ip 以做到這一點),但不是通過清漆。這是我在瀏覽器中得到的響應(重複了幾十次):

HTTP/1.1 301 Moved Permanently
Date: Tue, 02 Oct 2018 17:36:28 GMT
Server: Apache/2.4.18 (Ubuntu)
Location: https://example.com/
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

據我所知,這顯然是來自 apache 的響應,而不是來自 varnish 的響應(因為“伺服器”標頭和“通過”標頭失去)有什麼想法可以解決這個問題嗎?

基本上問題與 wp-config 有關。我插入了這段程式碼:

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $_SERVER['HTTPS'] = 'on';
}

if ( !isset( $_SERVER['HTTPS'] ) ) {
   $_SERVER['HTTPS'] = 'on';
}

它奏效了。最初我只是嘗試了 $_SERVER

$$ ‘HTTPS’ $$= ‘on’;,但我收到了 50 倍的錯誤。不知道究竟是為什麼。在其他 wp 安裝上,簡單的直接確實有效。將來我將不得不做更多的測試。

您可以嘗試按照此連結中的教程進行操作: https ://bash-prompt.net/guides/apache-varnish/

轉眼間,

VirtualHost *:443(無需更改此行)
- -程式碼 - -
**RequestHeader 設置 X-Forwarded-Proto expr=%{REQUEST_SCHEME}**
- -程式碼 - -
/虛擬主機

VirtualHost 127.0.0.1:8080(無需更改此行)
- -程式碼 - -
**SetEnvIf X-Forwarded-Proto https HTTPS=on**
- -程式碼 - -
/虛擬主機

引用自:https://serverfault.com/questions/933659