В некоторых сценариях нужно не «запретить доступ», а сделать более лёгкое «гео-разветвление»: на одной и той же странице пользователи из разных стран/регионов при клике по ссылке или кнопке должны попадать на разные целевые адреса. Обычно такое разветвление используют для: распределения ссылок на скачивание, разных платежных входов по регионам, разных систем поддержки, переключения входов на разные сайты (международный/локальный) и т. д.
Эта статья объясняет только одну ключевую вещь: при загрузке страницы фронтенд делает запрос GET https://my.ipin.io/info, чтобы получить код страны посетителя country,
а затем устанавливает href у <a> или адрес перехода по клику у <button> на URL, соответствующий региону.
Например, интерфейс может вернуть:
{"ip":"185.220.236.7","country":"TW","region":"Taiwan","city":"Taipei"}
1)Логика и принцип работы(2 абзаца)
Первый абзац: поток
Загрузка страницы → фронтенд сразу запрашивает https://my.ipin.io/info → получает country → по вашим правилам выбирает целевой URL (например, для TW использовать адрес A 1, для US — адрес A 2, для других регионов — адрес по умолчанию) →
обновляет «назначение» ссылки или кнопки на выбранный целевой URL. Пользователь перейдёт на нужный адрес только в момент клика.
Второй абзац: почему лучше сначала задать URL по умолчанию, а затем перезаписать по региону
Потому что фронтенд-среда нестабильна: сеть, CORS, блокировщики рекламы, таймауты API могут привести к тому, что country не получится получить. Более надёжный подход такой:
сначала на странице указать рабочий URL по умолчанию (универсальный лендинг), а после успешного определения региона — заменить его на региональный URL. Тогда даже при сбое интерфейса страница всё равно сможет корректно перейти, и не возникнет проблем «нажал — ничего не произошло / адрес пустой».
2)Реализация кода(супер просто,A и button объясняются отдельно)
2.1 Ссылка A(используем id):установить href по country
Сценарий: на странице есть одна ключевая ссылка, и вы хотите, чтобы она вела на разные адреса по региону. Ниже — самая простая логика:
если TW, использовать ссылку для TW, иначе — ссылку по умолчанию.
<a id="geoLink" href="https://example.com/default">Перейти сейчас</a>
<script>
(async function () {
try {
const info = await fetch("https://my.ipin.io/info").then(r => r.json());
const target = (info.country === "TW")
? "https://example.com/tw"
: "https://example.com/default";
const a = document.getElementById("geoLink");
if (a) a.href = target;
} catch (e) {
// При ошибке сохраняем href по умолчанию
}
})();
</script>
2.2 Ссылки A(используем class):массово установить href по country
Сценарий: на странице несколько ссылок, и все они должны разветвляться по регионам. Самый простой способ — дать им один и тот же class и обновить разом. Пример остаётся максимально простым: TW использует TW-ссылку, остальные регионы — ссылку по умолчанию.
<a class="geo-link" href="https://example.com/default">Вход на скачивание</a>
<a class="geo-link" href="https://example.com/default">Вход на покупку</a>
<script>
(async function () {
try {
const info = await fetch("https://my.ipin.io/info").then(r => r.json());
const target = (info.country === "TW")
? "https://example.com/tw"
: "https://example.com/default";
document.querySelectorAll(".geo-link").forEach(function (el) {
el.href = target;
});
} catch (e) {}
})();
</script>
2.3 Button(используем id):переход по клику в зависимости от country
Сценарий: кнопка сама по себе не является ссылкой, поэтому нужно привязать обработчик клика во фронтенде. Ниже — только самая суть: сначала выбираем целевой URL по country, затем при клике переходим на этот URL.
<button id="geoBtn" type="button">Нажмите для перехода</button>
<script>
(async function () {
let target = "https://example.com/default"; // URL по умолчанию
try {
const info = await fetch("https://my.ipin.io/info").then(r => r.json());
if (info.country === "TW") target = "https://example.com/tw";
} catch (e) {
// При ошибке используем URL по умолчанию
}
const btn = document.getElementById("geoBtn");
if (btn) btn.onclick = function () { window.location.href = target; };
})();
</script>
2.4 Button(используем class):массово привязать переход по клику
Сценарий: на странице несколько кнопок, и всем нужен переход по региону. Самый простой вариант — общий class и цикл для привязки обработчиков клика. Важно: у кнопки нет «href по умолчанию», поэтому рекомендуется заранее подготовить URL по умолчанию в скрипте, чтобы при сбое интерфейса кнопка не была «без реакции».
<button class="geo-btn" type="button">Кнопка 1</button>
<button class="geo-btn" type="button">Кнопка 2</button>
<script>
(async function () {
let target = "https://example.com/default"; // URL по умолчанию
try {
const info = await fetch("https://my.ipin.io/info").then(r => r.json());
if (info.country === "TW") target = "https://example.com/tw";
} catch (e) {}
document.querySelectorAll(".geo-btn").forEach(function (btn) {
btn.onclick = function () { window.location.href = target; };
});
})();
</script>
2.5 Несколько регионов(TW、US…):«сразу установить целевой URL» через таблицу соответствий (самый короткий рабочий вариант)
Самое простое правило: сначала задайте URL по умолчанию, затем перезапишите его таблицей соответствий map по коду страны.
Есть соответствие — используем его, нет — используем дефолт. Ключевой момент: после вычисления target нужно сразу применить его к href ссылки A или к обработчику клика кнопки.
2.5.1 Для A-ссылки(id):установить href напрямую
<a id="geoLink" href="https://example.com/default">Перейти сейчас</a>
<script>
(async function () {
const defaultUrl = "https://example.com/default";
const map = { TW: "https://example.com/tw", US: "https://example.com/us" };
try {
const info = await fetch("https://my.ipin.io/info").then(r => r.json());
const target = map[info.country] || defaultUrl;
document.getElementById("geoLink").href = target; // ✅ Ключ: записать target в href
} catch (e) {
// При ошибке оставляем href по умолчанию
}
})();
</script>
2.5.2 Для кнопки(id):переходить на target при клике
<button id="geoBtn" type="button">Нажмите для перехода</button>
<script>
(async function () {
const defaultUrl = "https://example.com/default";
const map = { TW: "https://example.com/tw", US: "https://example.com/us" };
let target = defaultUrl;
try {
const info = await fetch("https://my.ipin.io/info").then(r => r.json());
target = map[info.country] || defaultUrl;
} catch (e) {}
document.getElementById("geoBtn").onclick = function () {
window.location.href = target; // ✅ Ключ: переходить с target при клике
};
})();
</script>
3)Реализация в WordPress / Joomla / Magento / Shopify и т. д.(фронтенд-подход + код)
Реализация «менять назначение A-ссылки / назначения перехода кнопки по региону» по сути сводится к тому, чтобы вставить скрипт в общий Head сайта или файл шаблона/лейаута, чтобы он выполнялся как можно раньше. Не нужно менять серверную логику: если скрипт запускается при загрузке страницы, то до клика пользователя можно подготовить правильное назначение.
3.1 WordPress
- Использовать плагин «вставка скриптов в header/footer» и вставить код в Header(на весь сайт)
- Или вставить скрипт перед
</head>в файле темыheader.php
3.2 Joomla! / Joomla
- В текущем шаблоне найти
<head>вindex.phpи вставить скрипт перед</head> - Или использовать встроенную опцию шаблона «пользовательский код в head»(в зависимости от шаблона)
3.3 Magento
- Добавить скрипт в глобальный head темы(область head в theme/layout)
- Цель — единый вывод на весь сайт, чтобы удобно поддерживать правила маппинга по регионам
3.4 Shopify
- Online Store → Themes → Edit code
- Найти
theme.liquidи вставить скрипт перед</head>(на весь сайт)
3.5 Общие правила
- Любая система, где можно редактировать общий
<head>или файл лейаута, может реализовать «назначение ссылок/кнопок по IP-региону» тем же способом - Сохраняйте URL по умолчанию, чтобы при сбое внешнего API страница оставалась работоспособной
4)Итоги
> При загрузке страницы запрашиваем https://my.ipin.io/info, получаем country, затем по country выбираем целевой URL и обновляем либо href у A-ссылки, либо адрес перехода по клику кнопки, тем самым реализуя фронтенд-решение «гео-разветвления по IP на разные назначения».
На практике важны две вещи: во-первых, размещайте скрипт как можно раньше в head, чтобы заранее подготовить назначение; во-вторых, всегда держите URL по умолчанию, чтобы при сбое API не получить нерабочие ссылки или «молчащие» кнопки. Если поддерживать таблицу соответствий по регионам, решение стабильно работает для входов на скачивание, оплату и поддержку.
5)Частые вопросы
console.log(info), чтобы убедиться, что country действительно получен.
window.location.href = target на window.open(target, "_blank"). Обычно браузер не блокирует это, если вызов идёт из обработчика клика.
{ TW: "...", US: "..." }. Есть совпадение — используем соответствующий URL, нет — используем URL по умолчанию.
https://my.ipin.io/info, он не получит country и в итоге сможет использовать только URL по умолчанию. Перед публикацией рекомендуется проверить в консоли, что запрос выполняется успешно.