Русский
Мульти домены
Вы можете прикрепить домены и поддомены к своему сайту и управлять тем, какие заметки где будут видны. Для этого нужно прописать route в свойствах заметки.
Допустим, у вас портфолио, блог и лендинг для клиента. Без кастомных доменов всё это живёт на одном адресе и выглядит как папки одного сайта. С маршрутами каждый проект получает собственный домен, а вы управляете всем из одного места.
Хитрость: поддомен для папки
Если нужно назначить маршрут сразу целой папке, используйте frontmatter-патчи. Одно правило вместо ручной правки каждой заметки:
docs/** → { route: "docs.mysite.com" }
Все заметки из docs/ теперь открываются на docs.mysite.com по своему обычному permalink: docs/intro.md станет docs.mysite.com/docs/intro.
Главную страницу домена отдайте ровно одной заметке. Патч перезаписывает собственный route заметки, поэтому внутри папки с патчем используйте routes:
routes:
- docs.mysite.com/
Не ставьте слеш в конце маршрута в патче. С docs.mysite.com/ все заметки папки получают один и тот же адрес /, побеждает последняя загруженная, и главной страницей становится случайная заметка. Чтобы задавать путь каждой заметке отдельно, см. раздел «Папка → кастомный домен» ниже.
Кому подходит
- Фрилансерам, у которых есть портфолио и отдельный блог
- Агентствам, которые ведут несколько сайтов клиентов
- Авторам, которым нужен брендированный лендинг на своём домене
Как это работает
Укажите route или routes в frontmatter заметки:
---
route: mysite.com/
---
После этого заметка откроется на указанном URL. Основной permalink остаётся без изменений.
Варианты
Корень кастомного домена — заметка становится главной страницей домена:
route: mysite.com/
Страница на кастомном домене:
route: mysite.com/about
Несколько URL одновременно:
routes:
- mysite.com/
- mysite.com/home
- /alias-на-основном-домене
Алиас на основном домене — дополнительный URL без изменения permalink:
route: /blog
Домен без слеша — заметка будет доступна на кастомном домене по своему обычному permalink, а не на корне:
route: mysite.com
www.mysite.comиmysite.com— одно и то же. Регистр букв не важен. Порт сохраняется:localhost:8081.
Настройка DNS
- Укажите
route: yourdomain.com/в frontmatter заметки, которая станет главной, и маршруты для остальных страниц домена - У DNS-провайдера направьте домен на ваш сервер: запись
A/AAAAс IP-адресом сервера илиCNAMEна имя сервера для поддомена вродеdocs.yourdomain.com. На голом домене (yourdomain.com)CNAMEбыть не может: используйтеA/AAAAили записьALIAS/ANAME(CNAME flattening) вашего провайдера - После обновления DNS заметка откроется на домене
Сначала добавьте маршруты, потом переключайте DNS. Домен без маршрутов показывает весь основной сайт (см. ниже).
Отличие от slug
| slug | route / routes | |
|---|---|---|
| Меняет permalink | Да | Нет |
| Кастомный домен | Нет | Да |
| Несколько URL | Нет | Да |
| Алиасы | Нет | Да |
slug и route можно использовать вместе — они работают независимо.
Изоляция доменов
Домены изолированы:
- Заметки на
mysite.comне появляются на основном домене по этому пути - Алиасы основного домена (
route: /blog) не работают на кастомных доменах
При этом сама заметка по-прежнему открывается по своему permalink на основном домене. См. раздел «Дубли страниц» ниже.
Это позволяет один trip2g-сайт использовать как несколько независимых сайтов с разным контентом.
Ссылки между доменами
Викиссылки автоматически подстраиваются под домен читателя.
Допустим, заметка A на mysite.com ссылается на заметку B. Куда поведёт ссылка — зависит от того, где живёт B:
| Заметка B доступна на... | Ссылка будет |
|---|---|
Том же домене mysite.com |
Относительный путь: /about |
Другом кастомном домене other.com |
Полный URL: https://other.com/path |
| Только на основном домене | Канонический permalink |
На основном домене — наоборот. Если целевая заметка живёт только на кастомном домене, ссылка ведёт на полный URL этого домена. Если у заметки есть алиас на основном домене (route: /about), ссылка использует алиас.
Вставки ![[заметка]] всегда используют канонический permalink — домены на них не влияют.
RSS-лента, GraphQL API, MCP и Telegram тоже используют канонические ссылки. Кастомные домены на них не распространяются.
Что может пойти не так
DNS ещё не обновился. После изменения DNS-записи домен начинает работать через несколько часов, иногда до 48 часов. Проверьте через dig yourdomain.com или сервис вроде dnschecker.org.
Забыли слеш в конце. mysite.com и mysite.com/ — разные маршруты. Без слеша заметка будет доступна по своему обычному permalink на этом домене. Со слешем — станет главной страницей. Для корня нужен слеш: route: mysite.com/.
Нет HTTPS-сертификата. Встроенный в trip2g клиент Let's Encrypt выпускает сертификаты только для хостов из списка ACME-доменов (флаг -acme-domain, по одному на хост; www.mysite.com — отдельный хост). Маршрут не добавляет домен в этот список. На своём сервере либо добавьте домен в список и перезапустите trip2g, либо завершайте TLS в reverse proxy перед ним. См. Self-hosting.
Домен показывает весь основной сайт. Хост, который доходит до trip2g, но не имеет ни одного маршрута, считается основным доменом — под этим именем открываются все страницы основного сайта. Сначала добавьте маршруты, потом переключайте DNS. То же самое происходит, если удалить последний маршрут домена.
Страница отдаёт 404, хотя маршрут указан. Если frontmatter заметки — невалидный YAML, trip2g игнорирует весь блок: маршрут не регистрируется, а вместе с ним теряются free и все остальные свойства. Частая причина — двоеточие внутри значения без кавычек, например title: Тарифы: цены. Возьмите значение в кавычки: title: "Тарифы: цены".
Авторизация не работает на кастомном домене. Cookies привязаны к домену и не передаются между yoursite.trip2g.ru и mysite.com. Если заметка закрытая, пользователь должен войти отдельно на каждом домене. Для открытого контента добавьте free: true.
SEO на кастомном домене
Sitemap. Каждый кастомный домен отвечает на /sitemap.xml своим sitemap. В нём только заметки с маршрутом на этот домен, открытые (free) и без noindex. Добавляйте его в панель вебмастера каждого домена отдельно.
robots.txt и llms.txt. Заметка со slug: /robots.txt отвечает только на основном домене. Кастомному домену нужна своя заметка:
---
route: mysite.com/robots.txt
content_type: text/plain; charset=utf-8
free: true
noindex: true
search: false
---
User-agent: *
Disallow:
Sitemap: https://mysite.com/sitemap.xml
noindex: true не пускает сам файл в sitemap домена. Строку Sitemap: пишите абсолютным URL на том же домене. llms.txt делается так же, с route: mysite.com/llms.txt. См. robots.txt и llms.txt.
Дубли страниц
Заметка с маршрутом на кастомный домен по-прежнему открывается по своему permalink на основном домене и попадает в основной sitemap. В шаблоне по умолчанию каждая копия объявляет канонической себя, и поисковик видит две страницы с одинаковым текстом. Есть два выхода:
- Держите заметки домена в папке, имя которой начинается с
_, например_mysite/, и дайте каждой заметке маршрут с явным путём:mysite.com/about. trip2g никогда не отдаёт заметку по пути, содержащему/_, и не включает такие заметки в основной sitemap — остаётся только копия на кастомном домене. Маршрут без пути (mysite.com) здесь не подойдёт: он берёт permalink. Заметки в таких папках считаются системными: они пропадают также из поиска по сайту, похожих заметок и списков заметок. - Дайте этим заметкам свой layout, у которого canonical указывает на кастомный домен (см. ниже). Тогда обе копии называют канонической одну и ту же страницу. Копия на основном домене остаётся в основном sitemap.
Свои layout-ы
Шаблон по умолчанию пишет <link rel="canonical"> и og:url с тем адресом, по которому открыли страницу: маршрут на кастомном домене, permalink на основном. Свой Jet-layout получает только publicURL — адрес основного домена, поэтому canonical собирайте из маршрута заметки сами.
<meta name="robots"> свой layout тоже сам не пишет. trip2g отправляет заголовок X-Robots-Tag: noindex только для заметок с noindex: true. Выводите тег из свойства заметки с индексируемым значением по умолчанию: note.M().GetBool("noindex", false). Значение по умолчанию true помечает noindex каждую страницу без этого свойства: весь сайт выпадает из поиска, а HTTP-заголовки при этом выглядят чистыми.
Языки и аналитика
hreflang-ссылки всегда ведут на основной домен — и в <head> страницы, и в основном sitemap. В sitemap доменов их нет. См. Мультиязычный сайт.
HTML-инъекции из настроек сайта (счётчики аналитики, теги подтверждения) работают на всех доменах. Отдельный счётчик для домена ставьте в layout, которым пользуются заметки этого домена.
Авторизация
Cookies ограничены браузером и не передаются между доменами. Для заметок на кастомных доменах используйте free: true если контент открытый.
Нюансы
Каноническая ссылка не работает на кастомном домене. Если заметка доступна на mysite.com/about, открыть её по обычному permalink на mysite.com не получится — будет 404. Кастомный домен отдаёт только заметки с явным route.
route: / перекрывает главную страницу. Если указать route: / на основном домене, эта заметка заменит _index.md на корневом пути.
Две заметки с одинаковым route. Победит последняя загруженная. Избегайте дублирования маршрутов.
Заметка на нескольких доменах. Укажите все маршруты явно:
routes:
- mysite.com/
- other.com/
Маршруты через API
Маршруты можно добавлять не только в файле заметки, но и через API — с помощью frontmatter-патчей. Патч добавляет route или routes в метаданные заметки. Результат тот же, что при ручном указании в frontmatter.
Папка → кастомный домен
Типовой случай: всё, что лежит в папке landing/, должно открываться на landing.example. Такой патч (применённый к landing/**) позволяет каждой заметке из папки попадать на новый домен, оставляя за вами контроль над путём в каждой конкретной заметке:
if std.objectHas(meta, "route") then
if std.startsWith(meta.route, "/") then
{ route: "landing.example" + meta.route }
else
{}
else
{ route: "landing.example" }
Как это работает:
route у заметки |
Результат |
|---|---|
| не указан | route: landing.example — заметка доступна на новом домене по своему обычному permalink |
начинается с / (например /about) |
переписывается в landing.example/about — относительный алиас привязывается к кастомному домену |
абсолютный (other.com/x) |
не трогается |
Для главной страницы landing.example пропишите маршрут явно в landing/_index.md:
route: landing.example/
Патч не трогает абсолютные маршруты, поэтому такая форма безопаснее, чем route: / — голый / перехватил бы корень основного домена, если патч когда-нибудь отключат. На других страницах либо не указывайте route вообще (заметка будет открываться на новом домене по своему permalink), либо ставьте относительный алиас вроде route: /about — он станет landing.example/about.