Вопрос или проблема
У меня есть установка 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 моего второго сайта?
Ознакомлен с документацией / предложенными шагами:
- https://wordpress.org/support/article/debugging-a-wordpress-network/
- https://www.wpbeginner.com/wp-tutorials/how-to-install-and-setup-wordpress-multisite-network
- https://gist.github.com/JustThomas/141ebe0764d43188d4f2
- https://wordpress.stackexchange.com/questions/346020/trying-to-access-second-site-dashboard-on-a-multisite-configuration-proceeds-to
- https://docs.bitnami.com/aws/how-to/troubleshoot-wordpress-issues/
Редактировать: Полная конфигурация 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;
}
-
Удалите неправильное правило: Исключите строку
rewrite /wp-admin$ $host/$uri/ permanent;
из вашей конфигурации, так как она может вызывать зацикливание перенаправлений. -
Исправьте синтаксическую ошибку: Добавьте экранирование точки в последней строке
rewrite ^(/[^/]+)?(/.*\.php) $2 last;
для корректной работы.
Эти настройки должны исправить ошибку и позволить корректный доступ к админ-панели вашего второго блога. Если проблема сохраняется, стоит также проверить настройки базы данных и убедиться, что записи в таблицах wp_site
и wp_blogs
выполнены корректно. Убедитесь, что все пути и домены прописаны точно и соответствуют вашим настройкам сети WordPress.
Следуя этим рекомендациям, вы устраняете распространенные ошибки конфигурации и существенно снижаете вероятность появления лишних перенаправлений.