Используйте подсайт для определённых URL-адресов

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

У меня есть следующие правила в моем файле .htaccess на WordPress (одиночная установка):

# ПЕРЕПИСЬ ДОМЕНА ФОРУМОВ В ПАПКУ
RewriteCond %{HTTP_HOST} ^forums\.example\.com$
RewriteRule !^forums/? forums%{REQUEST_URI} [NC,L]

# ПЕРЕПИСЬ ПАПКИ ФОРУМОВ В СУБДОМЕН
RewriteCond %{THE_REQUEST} \s/forums/([^\s]*) [NC]
RewriteRule ^ http://forums.example.com/%1 [R=301,L]

Это нужно, чтобы форумы, которые существуют по адресу http://example.com/forums, можно было получить по адресу http://forums.example.com/

Однако сервер просто «разрывается» с ошибкой 500…

Есть идеи, как это сделать? Эти правила идеально работают на не-WordPress сайтах… Вторые правила переписывания успешно отправляют /forums на субдомен, но субдомен, похоже, не может правильно передать данные в WordPress.

Весь файл htaccess выглядит следующим образом:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# ПЕРЕПИСЬ ДОМЕНА ФОРУМОВ В ПАПКУ
RewriteCond %{HTTP_HOST} ^forums\.example\.com$
RewriteRule !^forums/? forums%{REQUEST_URI} [NC,L]

# ПЕРЕПИСЬ ПАПКИ ФОРУМОВ В СУБДОМЕН
RewriteCond %{THE_REQUEST} \s/forums/([^\s]*) [NC]
RewriteRule ^ http://forums.example.com/%1 [R=301,L]

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

</IfModule>

Причина, по которой правила WordPress стоят после правил форумов, в том, что если я поставлю их позже, они никогда не срабатывают!

Попробуйте это (не тестировалось):

# BEGIN ПЕРЕПИСЬ ФОРУМОВ
RewriteCond %{HTTP_HOST} !^www\.domain.com
RewriteCond %{HTTP_HOST} ([^.]+)\.domain.com
RewriteRule ^(.*)$ forums/%1
# END ПЕРЕПИСЬ ФОРУМОВ

Это должно работать с вашими требованиями. Вам не нужно второе правило (переписывание папки форумов на субдомен), потому что переписывание фактического ID форума переопределит основное правило переписывания субдомена forums.domain.com/forumid=16.

Вы должны добавить эти строки после тех, которые сгенерировал WordPress.

Это, вероятно, не очень тривиально. Вам нужно учитывать, что WordPress нуждается в директории “forums” в URL, чтобы успешно определить, что запрашиваемый контент является сообщением форума, а не обычными сообщениями или страницами. Поэтому вам нужно изменить значение REQUEST_URI в файле htaccess или добавить свой собственный код парсинга URL.

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

Я предлагаю следующее решение. Необходимо добавить эти строки в index.php.

if (!empty($_SERVER['REDIRECT_URL'])) {
    $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL'];
}

Я знаю, что это грязный хак, но механизм переписывания WordPress основан на значении $_SERVER['REQUEST_URI'].

Эти правила были протестированы только на ссылках типа (с другим доменом) http://example.com/forums/ и http://forums.example.com/. Дайте мне знать, если они не работают на других ссылках.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# Правило остановки WordPress
RewriteRule ^index\.php$ - [L]

# добавляем префикс субдомена
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteCond %{HTTP_HOST} ^forums\.example\.com$
RewriteRule !^forums/? forums%{REQUEST_URI} [NC,L]

# переадресация на субдомен
RewriteCond %{HTTP_HOST} !^forums\.example\.com$
RewriteCond %{REQUEST_URI} ^/forums/(.*) [NC]
RewriteRule ^ http://forums.example.com/%1 [R=301,L]

# Переписывание WordPress с избеганием уже существующего файла и директории
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# избегать бесконечного цикла переписывания (на всякий случай)
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
</IfModule>

Если я могу предложить альтернативное решение, в репозитории есть плагин, который позволит сопоставлять домены или субдомены на стороне WordPress. Я использую плагин Multiple Domains от Маттиаса Вагнера для выполнения чего-то очень похожего на одном из моих сайтов.

Чтобы это настроить, просто направьте субдомен на вашу установку WordPress, что вы, очевидно, уже сделали. В настройках плагина добавьте ваше сопоставление, чтобы сопоставить http://forums.example.com с http://www.example.com/forums.

Использование этого плагина (или аналогичного) имеет дополнительное преимущество в том, что WordPress «распознает» сопоставление, так что ваши сообщения форума будут сообщать свой канонический URI с субдоменом, а не с основным доменом. Это может не быть критичным для вашего применения, но это поможет поисковым системам и другим ботам идентифицировать ваши сообщения форума с выбранным вами URI, а не с местоположением WordPress по умолчанию.

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

Чтобы корректно настроить использование поддомена для определённых URL на сайте WordPress, необходимо использовать файл .htaccess и, возможно, внести некоторые изменения в код. Рассмотрим, как это можно сделать.

Шаг 1: Настройка .htaccess

Сначала убедитесь, что ваш файл .htaccess настроен правильно. Вот пример конфигурации, который должен помочь в вашем случае:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# Правило для создания поддомена forums.example.com
RewriteCond %{HTTP_HOST} ^forums\.example\.com$ [NC]
RewriteRule ^(.*)$ /forums/$1 [L]

# Правило для перенаправления запросов к /forums на поддомен
RewriteCond %{HTTP_HOST} !^forums\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} ^/forums/(.*) [NC]
RewriteRule ^ /forums/%1 [R=301,L]

# Стандартные правила WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Шаг 2: Обработка REQUEST_URI в index.php

WordPress полагается на переменную $_SERVER['REQUEST_URI'], чтобы определить, какие страницы загружать. Поскольку мы перенаправляем запросы, важно корректно передавать информацию о запрашиваемом URL. В index.php вам нужно добавить следующий код в начало файла:

if (!empty($_SERVER['REDIRECT_URL'])) {
    $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL'];
}

Этот код позволяет WordPress правильно обрабатывать перенаправления с учётом оригинального пути запроса.

Шаг 3: Использование плагина (альтернативный подход)

Если вышеописанные методы не работают, может быть полезно рассмотреть использование плагина. Один из таких плагинов называется Multiple Domain Mapping on Single Site, разработанный Маттиасом Вагнером. Установите его через интерфейс плагинов WordPress и выполните следующие действия:

  1. Установите и активируйте плагин.
  2. Перейдите в настройки плагина и добавьте маппинг поддомена:
    • Установите, что http://forums.example.com ссылается на http://www.example.com/forums.
  3. Это позволит WordPress корректно идентифицировать URL ваших форумов, предоставляя оптимальные условия для SEO.

Заключение

С учетом всех вышеперечисленных шагов, ваш сайт должен корректно обрабатывать запросы на поддомен forums.example.com и перенаправлять их на правильный путь внутри вашей установки WordPress. Если у вас возникнут трудности, рекомендуется проверить логи вашего сервера на наличие ошибок и убедиться, что модули Apache, необходимые для работы правил переписывания (mod_rewrite), включены.

Если у вас есть дополнительные вопросы или вы столкнётесь с проблемами, не стесняйтесь обращаться за дополнительной помощью.

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

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