WordPress MU и битва с www

Опубликовано 21.02.2010 в 18:11 в разделе ,
На правах рекламы: Аудит безопасности сайтов pentestit.ru.

Для людей, работавших  WordPress MU, не будет секретом тот факт, что адрес основного блога в WordPress всегда должен быть записан без «www» в начале. Существует хак, позволяющий обойти это неприятное ограничение многопользовательского WordPress и порадовать тех, кого эстетически привлекает три дабл-ю в начале адреса сайта.

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

Предположим, на сайте example.com мы хотим сделать основным адресом не собственно example.com, а www.example.com. При этом блоги третьего уровня не должны обрести адрес sub.www.example.com вместо привычного sub.example.com.

Все указания даются для WordPress MU версии 2.8.6, который я использовал на своём сайте. Тестовый сайт работает на WordPress MU 2.8.6 и BuddyPress 1.1.3 без ошибок.

Шаг 1. База данных.

Прежде всего, нам требуется настроить параметры в самой базе данных. Если попытаться сделать это прямо из сайта, возникнет проблема — циклическое перенаправление не даст нам возможность работать с самим сайтом.

  1. Таблица wp_blogs — заменяем значение поля domain у блога под номером 1 с example.com на www.example.com
  2. Таблица wp_1_options — заменяем option_value с http://example.com на http://www.example.com у строк с option_name параметром home и siteurl
  3. В таблице wp_site ни в коем случае ничего не трогаем!!

На сайт после этих изменений не заходим.

Шаг 2. Файл wpmu-settings.php

Мы должны разрешить WordPress MU воспринимать основной домен  с префиксом www, не отправляя его на домен без префикса. Для этого проведём ряд замен.

Строка ~ 9

if( substr( $domain, 0, 4 ) == 'www.')

Заменяем на

if( substr( $domain, 0, 4 ) == 'www.' && $domain != 'www.'.DOMAIN_CURRENT_SITE)

Таким образом, www для основного домена обрезаться не будет.

Строка ~ 119

$current_blog = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE domain = %s ", $domain) );

Заменяем на

$current_blog = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE domain = %s OR domain = %s", $domain, 'www.'.$domain) );

Строка ~ 140

$current_blog = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s", $domain, $path) );

Заменяем на

$current_blog = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE (domain = %s OR domain = %s) AND path = %s", $domain, 'www.'.$domain, $path) );

Теперь наш сайт не боится доменов с префиксом www. Или почти не боится.

Шаг 3. Перенаправление

В файле .htaccess реализуем простое перенаправление с example.com на www.example.com

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [L,R=301]

Шаг 4. Домен-ошибка

В файле wp-config.php рекомендую указать такую строку:

define( 'NOBLOGREDIRECT', 'http://www.example.com/' ); 

Шаг 5. Тестирование.

После вышеприведённых  операций мой сайт на WordPress MU стал легко и просто работать с www-доменами. Надеюсь, Вы догадались перед всем этим концертом сделать бэкап? ;)

P.S.: оглядывая ещё раз все пункты, мне начинает казаться, что работает это только благодаря странной магии, ибо сами действия лишены смысла. Буду благодарен тому, кто найдёт более красивое решение проблемы.

P.P.S.:  «И всё таки она вертится!» на сайте http://www.fld.av13.ru без проблем =)

И снова на правах рекламы: Instgram volgers kopen
  • изврат… а если сделать редирект в htacces?…

  • Изврат, говорите? Да, разумеется изврат, но с WordPress MU иначе никак — это не простой вордпресс. WordPress MU, при использовании блогов на поддоменах, не поддерживает по умолчанию www в доменах (об этом ещё при установке написано).

    Редирект в htaccess разумеется делается, но это лишь часть всего процесса (см. пункт 3).

    Нужно прежде всего обучить систему воспринимать (!) основной домен с www, то есть прописывать все ссылки в системе не на http://examlple.com/smth.html, а именно на http://www.example.com/smth.html, иначе такое перенаправление никому просто не нужно.

    Кроме того, если не сделать подобного изврата, то мы получим циклический редирект. WordPress перенаправляет все страницы «вручную» средствами php и отправкой location-заголовка. Если направленная к нему ссылка не соответствует имени домена (отсутствие или присутствие www считается несоответствием), то он автоматически перенаправляет её на «правильную». Если мы делаем просто редирект в htaccess-е, то в итоге система просто зависает на перенаправлении http://example.comhttp://www.example.comhttp://example.comhttp://www.example.com → …

    Если интересно, попробуйте самостоятельно, буду рад более простому решению для WordPress MU с блогами на поддоменах.

  • Спасибо, а я мучался…

    • Очень рад помочь) Кстати, как мне показалось, действие со строками 119 и 140 оказались необязательными — обновлял http://www.fld.mrsu.ru, работает и без этих строк идеально!)

  • Поломанная песочница