Назад | Перейти на главную страницу

wordpress ERR_TOO_MANY_REDIRECTS через лак, но не через apache

У меня странная проблема с настройкой 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