Вопрос или проблема
Вот ситуация:
Конфигурация
У меня есть настройка WordPress multisite, где разные сайты находятся на разных доменах. Некоторые из этих сайтов находятся в подпапке их домена, некоторые – нет. Для сайтов, которые находятся в подпапке, имя подпапки одинаково для всех сайтов.
Вот примеры:
Сайт | URL ----------------------- Основной сайт | example.com Сайт A | sitea.com Сайт B | siteb.com/foo Сайт C | sitec.com/foo Сайт D | sited.com
Вот соответствующая часть моего wp-config.php:
/* Multisite */
define( 'WP_ALLOW_MULTISITE', true );
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'example.com');
define('PATH_CURRENT_SITE', "https://wordpress.stackexchange.com/");
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
Вот мой .htaccess:
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# добавьте завершающий слэш к /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
# END WordPress
Проблема
В этой конфигурации Основной сайт и Сайты A и D работают, но Сайты B и C выдают ошибку 500. Если я изменю RewriteBase /
на RewriteBase /foo/
, то будет обратная ситуация: Сайты B и C работают, но Основной сайт, Сайт A и Сайт D выдают ошибку 500.
Если бы эффекты RewriteBase /foo/
применялись условно только к доменам, у которых URI начинался на /foo
, тогда, я думаю, это решило бы проблему. К сожалению, я не понимаю, как WordPress и .htaccess взаимодействуют достаточно хорошо, чтобы сделать это.
Кто-нибудь имеет какие-нибудь предложения?
Спасибо.
Нашел решение для тех, кто может наткнуться на это. В основном, каждая часть стандартного .htaccess WordPress теперь имеет два RewriteCond: один для случаев, когда он находится в подпапке, и другой для случаев, когда нет. В зависимости от этой оценки применяется соответствующее правило RewriteRule.
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# добавьте завершающий слэш к /wp-admin
RewriteCond %{REQUEST_URI} ^/([_0-9a-zA-Z-]+/)wp-admin$
RewriteRule ^([_0-9a-zA-Z-]+/)wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_URI} !^/([_0-9a-zA-Z-]+/)wp-admin$
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteCond %{REQUEST_URI} ^/([_0-9a-zA-Z-]+/)(wp-(content|admin|includes).*)
RewriteRule ^([_0-9a-zA-Z-]+/)(wp-(content|admin|includes).*) $2 [L]
RewriteCond %{REQUEST_URI} !^/([_0-9a-zA-Z-]+/)(wp-(content|admin|includes).*)
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteCond %{REQUEST_URI} ^/([_0-9a-zA-Z-]+/)?(.*\.php)
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteCond %{REQUEST_URI} !^/([_0-9a-zA-Z-]+/)?(.*\.php)
RewriteRule ^(.*\.php)$ $1 [L]
RewriteCond %{REQUEST_URI} ^/foo/
RewriteRule . foo/index.php [L]
RewriteCond %{REQUEST_URI} !^/foo/
RewriteRule . index.php [L]
# END WordPress
Ответ или решение
Конфигурация WordPress Multisite с Разными Доменами и Подкаталогами
Введение
Ваша задача заключается в настройке мультисайтовой сети WordPress, где сайты располагаются на различных доменах, некоторые из которых находятся в подкаталогах. Понимание правильной конфигурации .htaccess
в подобной ситуации имеет решающее значение для обеспечения стабильной работы всех сайтов.
Проблема
В вашей конфигурации, вы столкнулись с проблемой, когда сайты B и C, расположенные в подкаталоге /foo
, выдают ошибку 500, в то время как остальные сайты работают исправно. Изменение RewriteBase
на /foo/
решает проблему для сайтов B и C, но вызывает сбой для остальных.
Решение
Ваше найденное решение — это введение условий в правила перезаписи. Это позволяет динамически обрабатывать запросы в зависимости от соответствующего URL. Ниже представлено объяснение модифицированной конфигурации .htaccess
, которая учитывает разные сценарии.
Конфигурация .htaccess
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# Добавление слешей к /wp-admin
RewriteCond %{REQUEST_URI} ^/([_0-9a-zA-Z-]+)/wp-admin$
RewriteRule ^([_0-9a-zA-Z-]+)/wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_URI} !^/([_0-9a-zA-Z-]+)/wp-admin$
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
# Если файл или директория существует
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# Применение к файлам wp-content, wp-admin и wp-includes
RewriteCond %{REQUEST_URI} ^/([_0-9a-zA-Z-]+)/?(wp-(content|admin|includes).*)
RewriteRule ^([_0-9a-zA-Z-]+)/?(wp-(content|admin|includes).*) $2 [L]
RewriteCond %{REQUEST_URI} !^/([_0-9a-zA-Z-]+)/?(wp-(content|admin|includes).*)
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
# Применение к файлам PHP
RewriteCond %{REQUEST_URI} ^/([_0-9a-zA-Z-]+)/?(.*\.php)
RewriteRule ^([_0-9a-zA-Z-]+)/?(.*\.php)$ $2 [L]
RewriteCond %{REQUEST_URI} !^/([_0-9a-zA-Z-]+)/?(.*\.php)
RewriteRule ^(.*\.php)$ $1 [L]
# Обработка запросов к подкаталогу /foo/
RewriteCond %{REQUEST_URI} ^/foo/
RewriteRule . foo/index.php [L]
RewriteCond %{REQUEST_URI} !^/foo/
RewriteRule . index.php [L]
# END WordPress
Объяснение Правил
-
RewriteBase и Условия –
RewriteBase /
устанавливает базовый путь, к которому применяются остальные правила. Условия (RewriteCond
) проверяют, соответствует ли запрашиваемый URI шаблону (например,/foo/
). В зависимости от этого, будут применяться правильные правила перезаписи. -
Добавление Слешей к
wp-admin
– Условия проверяют наличие слеша после/wp-admin
. Это важно для правильного редиректа. -
Файлы и директории – Условия проверяют, существуют ли запрашиваемые файлы или директории на сервере. Если да, то запрос не обрабатывается дальше, и возвращается соответствующий файл.
-
Обработка PHP – Позволяет обработать PHP-скрипты, корректно используя условные проверки для различных сайтов.
-
Специальная Обработка для
/foo/
– В конце добавлено отдельное правило для обработки запросов кfoo/index.php
только для сайтов B и C. Если URI не начинается с/foo/
, будет использоваться стандартное правило.
Заключение
Настройка мультисайтовой сети WordPress, особенно при наличии различных доменов и подкаталогов, требует тщательной конфигурации .htaccess
. Использование условий для различной обработки URL позволяет избежать ошибок и обеспечивает стабильную работу всех ваших сайтов. Данная конфигурация должна помочь вам устранить проблемы с ошибками 500 и позволить вашим сайтам функционировать должным образом.