Мультисайт, разные домены, опциональный подкаталог и htaccess

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

Вот ситуация:

Конфигурация

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

Объяснение Правил

  1. RewriteBase и УсловияRewriteBase / устанавливает базовый путь, к которому применяются остальные правила. Условия (RewriteCond) проверяют, соответствует ли запрашиваемый URI шаблону (например, /foo/). В зависимости от этого, будут применяться правильные правила перезаписи.

  2. Добавление Слешей к wp-admin – Условия проверяют наличие слеша после /wp-admin. Это важно для правильного редиректа.

  3. Файлы и директории – Условия проверяют, существуют ли запрашиваемые файлы или директории на сервере. Если да, то запрос не обрабатывается дальше, и возвращается соответствующий файл.

  4. Обработка PHP – Позволяет обработать PHP-скрипты, корректно используя условные проверки для различных сайтов.

  5. Специальная Обработка для /foo/ – В конце добавлено отдельное правило для обработки запросов к foo/index.php только для сайтов B и C. Если URI не начинается с /foo/, будет использоваться стандартное правило.

Заключение

Настройка мультисайтовой сети WordPress, особенно при наличии различных доменов и подкаталогов, требует тщательной конфигурации .htaccess. Использование условий для различной обработки URL позволяет избежать ошибок и обеспечивает стабильную работу всех ваших сайтов. Данная конфигурация должна помочь вам устранить проблемы с ошибками 500 и позволить вашим сайтам функционировать должным образом.

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

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