Base_url для нескольких доменов одного сайта

Решение для тех, кто устал бороться с несколькими доменами одного сайта и не знает, что с этим делать (возможно, что такие есть))))

1. Создаем сниппет siteUrl следующего содержания

<?php
return MODX_SITE_URL;
?>


2. В хидере сайта заменяем
<base href="[(site_url)]">
на
<base href="[!siteUrl!]">
. В результате избавляемся от «непонятных» перекидываний то на домен с www, то на домен без www, то на тестовый домен (это я еще не говорю про те сайты, которые изначально крутятся одновременно на нескольких доменах.

Все дело в том, что [(site_url)] кэшируется один раз и на разных страницах в зависимости от «точки входа» может быть разным — отсюда и проблемы с переходами туда/сюда (в критических случаях, практически всегда — вплоть до сброса корзины шопкипера на страницах с www и без него). Также очень актуально для ajax, когда мы «неожиданно» получаем «кроссдоменные» запросы, которые не работают :)

Решение конечно элементарнейшее, но после очередного вопроса решил написать о нем на видном месте :)

13 комментариев

avatar
Также очень актуально для ajax, когда мы «неожиданно» получаем «кроссдоменные» запросы, которые не работают :)

Да, было такое дело, когда www и без — уже проблемка для аякс запросов =) Примерно также пришлось решать проблему с base_url
avatar
Спасибо за подсказку, только недавно заметил что иногда домен на некоторых страницах становится с www, думал как решать :)
avatar
Не совсем понял, а зачем писать сниппет?
Что мешает изначально в хедере написать:
<base href="[(site_url)]">

Или он тоже кешируется один раз?
avatar
Если страница кэшированная (а таких почти все) — то естественно кэшируется. И в итоге если после очистки кэша на одну страницу войти как site.ru, а на вторую — как www.site.ru (ну а если еще и домен другой есть — то на третью по адресу site.com), то получим на всех трех страницах разные base href в кэше. Что приведет к тому, что на первой странице ко всем относительным ссылкам прибавится site.ru (в том числе в меню и т.д.), на второй странице все относительные ссылки поведут на сайт www.site.ru, ну а с третьей страницы уйдем на site.com по всем относительным ссылкам.
Особенно это критично в магазине, где для разных доменов разные сессии и корзины — отчего у не слишком опытных юзеров шопкипера иногда бывает ступор — на одной странице показывается одна корзина, а на второй — совершенно другая :))))
avatar
Понял.
У меня на всех сайтах основное доменное имя одно, а с дополнительных доменов типа домен.РФ и подобных я сразу же делаю редирект 301 в htaccess. То же самое (301 редирект) сразу делаю и с www на не-www (или наоборот).

Поэтому зайти на страницу по «неужному» УРЛу просто не получится. А нужды в многодоменном сайте пока не возникало.

Вопрос по кешированию был вызван тем, что я не разбирался, как кешируются конструкции типа site_url в MODx. Про сниппеты понимаю, а вот про это — не очень.

Кстати, а каково в общем случае время жизни кеша в MODx? почему-то никогда не задавался этим вопросом.
Комментарий отредактирован 2015-08-04 17:18:28 пользователем Harand
avatar
Нет никакого времени жизни кэша — пока его не очистят, он и существует :) А очищается он при каждом сохранении ресурса, например :)
avatar
Ясно. В некоторых других CMS по-другому.
avatar
а чем плохо
<base href="/">

?
Комментарий отредактирован 2015-08-04 15:13:22 пользователем swed
  • swed
  • 0
avatar
Ничем не плохо, если вас конечно не смущает, что относительный адрес в base href не поддерживает половина браузеров, особенно webkit — поскольку логика этого тега как раз и состоит в том, чтобы относительную адресацию превратить в «абсолютную» :)
avatar
это как раз и есть указатель абсолютной адресации на корень текущего сайта,
соотв все ссылки вида
<img src="assets/images/image.jpg" />
становятся аналогичными
<img src="/assets/images/image.jpg" />
avatar
Абсолютный адрес содержит указание протокола и домен, такой адрес однозначно идентифицирует страницу.

А ваш вариант — это адресация относительно корня, т.е. относительная.
avatar
хорошо, я не правильно выразился — абсолютная — начиная с протокола, и два вида относительных ссылок — относительно текущего документа (base нет или указывает на текущий) и относительно корня.
Тогда перефразируя вопрос.
Почему бы не использовать base относительно корня?
не знаю о какой половине браузеров говорит webber, я с такими не встречался.
имхо, единственная причина, указывать полный адрес в base (или в ссылках) — это очень слабая попытка сохранить авторство при скачивании или использовании текста с такой страницы. например если скачать wget'ом только одну страницу (без создании зеркала и конвертирования ссылок) — и открыть ее, то соотв ссылки будут вести на сайт, а при "/" в корень файловой системы…
впрочем, возможно еще есть какие-то SEO тонкости, в дебри которых я не углублялся…
avatar
Насчет кроссбраузерности также не владею информацией.

Про попытку сохранить авторство — да, согласен, в этом есть логика.

Про СЕО — тонкости: думаю, для сайта действительно лучше, когда в коде страницы есть адрес домена (для витальных запросов, особенно если название близко к доменному имени).

Есть и один случай, когда домен точно нужно указывать в УРЛ (по рекомендациям Гугла) — это rel canonical. Правда, я для этого написал микросниппет, в котором использовал modx->makeUrl из API.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.