У меня странная проблема с настройкой varnish-wordpress. Я получаю TOO_MANY_REDIRECTS, когда пытаюсь перенаправить трафик через varnish, но если я настрою apache напрямую с vhost, прослушивающим 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 в hosts), но не через лак. Это ответ, который я получаю в браузере (который повторяется десятки раз):
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, насколько я могу судить (из-за заголовка 'server' и из-за отсутствия заголовка 'via'). Есть идеи, как я могу это исправить?
В основном проблема была связана с wp-config. Я вставил этот код:
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
}
if ( !isset( $_SERVER['HTTPS'] ) ) {
$_SERVER['HTTPS'] = 'on';
}
И это сработало. Сначала я просто попробовал $ _SERVER ['HTTPS'] = 'on';, но получил ошибку 50x. Не знаю, почему. При другой установке wp простой напрямую работал. В будущем мне придется провести еще несколько тестов.
Вы можете попробовать следовать руководству по этой ссылке: https://bash-prompt.net/guides/apache-varnish/
В один миг,
VirtualHost *:443(no need to change this line) ---Code--- **RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}** ---Code--- /VirtualHost VirtualHost 127.0.0.1:8080(no need to change this line) ---code--- **SetEnvIf X-Forwarded-Proto https HTTPS=on** ---code--- /VirtualHost