WordPress Multisite: администратор второго сайта вызывает ошибку «слишком много перенаправлений».

Вопрос или проблема

У меня есть установка multisite, которая, кажется, работает нормально для первого сайта, но для второго сайт админ-панель вызывает «слишком много перенаправлений». Какова правильная конфигурация nginx или wordpress, чтобы это работало?

У меня есть установка не на WordPress на example.com
Мой первый блог настроен на example.com/blog
Мой второй блог настроен на example.com/blog/tr. Фронтенд отображается нормально.

Админка первого сайта работает отлично, как и сеть администраторов.
Таким образом, https://example.com/blog/wp-admin и https://example.com/blog/wp-admin/network/ приводят к рабочим страницам. Однако URL https://example.com/blog/tr/wp-admin приводит к слишком большому количеству перенаправлений.

Моя конфигурация nginx для секций wp-admin выглядит следующим образом:

if (!-e $request_filename) {
     rewrite /wp-admin$ $scheme://$host$uri/ permanent;     
     rewrite /wp-admin$ $host/$uri/ permanent;
     rewrite ^(/[^/]+)?(/wp-.*) $2 last;
     rewrite ^(/[^/]+)?(/.*.php) $2 last;
}

Вот мои таблицы wp_blogs и wp_site:

mysql> SELECT * FROM wp_site;
+----+-------------+--------+
| id | domain      | path   |
+----+-------------+--------+
|  1 | example.com | /blog/ |
+----+-------------+--------+

mysql> SELECT blog_id, site_id, domain, path FROM wp_blogs;
+---------+---------+-------------+-----------+
| blog_id | site_id | domain      | path      |
+---------+---------+-------------+-----------+
|       1 |       1 | example.com | /blog/    |
|       2 |       1 | example.com | /blog/tr/ |
+---------+---------+-------------+-----------+

wp-config.php

define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false );
define( 'DOMAIN_CURRENT_SITE', 'example.com' );
define( 'PATH_CURRENT_SITE', '/blog/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );

Я попытался изменить путь для второго блога на что-то с другим путем, например, /blg/tr, на случай, если это была ошибка столкновения путей, и у меня все равно возникала проблема. Я также попытался создать второй сайт в wp_sites и ассоциировать второй блог с этим вторым сайтом, но это также ничего не изменило.

Я также добавил конкретные блоки расположения nginx для /blog/tr/wp-admin, и это, кажется, еще больше ломало его разными способами.

Есть ли что-то, чего я не учитываю, или дополнительная документация, которую я не могу найти, чтобы помочь отладить раздел wp-admin моего второго сайта?

Ознакомлен с документацией / предложенными шагами:

Редактировать: Полная конфигурация nginx

server {
        listen 80;
        listen 443 ssl;
        ## Your website name goes here.
        server_name example.com;
        ## Your only path reference.
        root /Users/lfarr/Sites/blog;
        ## This should be in your http block and if it is, it's not needed here.
        index index.php;

        ssl_certificate     /usr/local/etc/nginx/ssl/example.com+4.pem;
        ssl_certificate_key /usr/local/etc/nginx/ssl/example.com+4-key.pem;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        if (!-e $request_filename) {
            rewrite /wp-admin$ $scheme://$host$uri/ permanent;
            rewrite /wp-admin$ $host/$uri/ permanent;
            rewrite ^(/[^/]+)?(/wp-.*) $2 last;
            rewrite ^(/[^/]+)?(/.*.php) $2 last;
        }

        #avoid php readfile()
        location ^~ /blogs.dir {
            internal;
            alias /var/www/example.com/htdocs/wp-content/blogs.dir ;
            access_log off;     log_not_found off; expires max;
        }

        location / {
                # This is cool because no php is touched for static content.
                # include the "?$args" part so non-default permalinks doesn't break when using query string
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                include fastcgi_params;
                fastcgi_intercept_errors on;
                fastcgi_pass fastcgi_backend;
                #The following parameter can be also included in fastcgi_params file
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Казалось бы, есть проблема с конфигурацией nginx. Есть ли причина, по которой вы изменили это правило иначе, чем это задокументировано в документации wordpress? (https://wordpress.org/support/article/nginx/#wordpress-multisite-subdirectory-rules)

Я говорю конкретно о следующем правиле:

if (!-e $request_filename) {
 rewrite /wp-admin$ $scheme://$host$uri/ permanent;     
 rewrite /wp-admin$ $host/$uri/ permanent;
 rewrite ^(/[^/]+)?(/wp-.*) $2 last;
 rewrite ^(/[^/]+)?(/.*.php) $2 last; 
}

Я думаю, что вы можете удалить 3-ю строку в приведенном выше правиле (rewrite /wp-admin$ $host/$uri/ permanent;), так как она тоже отсутствует в документации, и, как мне кажется, все необходимое уже есть в первом правиле этого блока.

Кроме этого, в последнем правиле (rewrite ^(/[^/]+)?(/.*.php) $2 last;) отсутствует символ экранирования, который также присутствует в документации. Так что вы можете попробовать заменить приведенный выше блок полностью, как показано в документе ниже?

if (!-e $request_filename) {
        rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
        rewrite ^(/[^/]+)?(/wp-.*) $2 last;
        rewrite ^(/[^/]+)?(/.*\.php) $2 last;
    }

Ответ или решение

Ваша проблема с перенаправлениями в WordPress Multisite, возникающая при попытке доступа к админ-панели второго сайта, вероятно, связана с некорректной конфигурацией Nginx. Мы разберем возможные причины этой ошибки и предложим решения на основе вашей ситуации.

Теория

Суть проблемы "слишком много перенаправлений" заключается в зацикливании процессоров перенаправления, когда браузер получает противоречивые указания, какое именно URL использовать для доступа. Это чаще всего происходит из-за ошибочных конфигураций веб-сервера или неправильных записей в базе данных WordPress.

Пример

Ваш Nginx использует данные правила для управления обращениями к панели администрирования WordPress. Однако одна из строк в вашем конфиге может вызывать зацикливание. У вас записано:

rewrite /wp-admin$ $host/$uri/ permanent;

Кроме того, строка:

rewrite ^(/[^/]+)?(/.*.php) $2 last;

содержит синтаксическую ошибку — отсутствует экранирование точки.

Применение

Для решения вашей проблемы рекомендуется изменить раздел конфигурации Nginx для обработки перенаправлений таким образом, как это описано в официальной документации WordPress для мультисайтов с подкаталогами. Вот предполагаемая конфигурация:

if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
    rewrite ^(/[^/]+)?(/wp-.*) $2 last;
    rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
  1. Удалите неправильное правило: Исключите строку rewrite /wp-admin$ $host/$uri/ permanent; из вашей конфигурации, так как она может вызывать зацикливание перенаправлений.

  2. Исправьте синтаксическую ошибку: Добавьте экранирование точки в последней строке rewrite ^(/[^/]+)?(/.*\.php) $2 last; для корректной работы.

Эти настройки должны исправить ошибку и позволить корректный доступ к админ-панели вашего второго блога. Если проблема сохраняется, стоит также проверить настройки базы данных и убедиться, что записи в таблицах wp_site и wp_blogs выполнены корректно. Убедитесь, что все пути и домены прописаны точно и соответствуют вашим настройкам сети WordPress.

Следуя этим рекомендациям, вы устраняете распространенные ошибки конфигурации и существенно снижаете вероятность появления лишних перенаправлений.

Оцените материал
Добавить комментарий

Капча загружается...