Apache-2.4
wordpress ERR_TOO_MANY_REDIRECTS 通過清漆,但不通過 apache
我在使用 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** - -程式碼 - - /虛擬主機