ドイツの出口を通してページを開くと英語が表示される。同僚が同じアドレスを開くと米国のストアが表示される。どちらも正しいプロキシを使っているのに、何が起きたのか。ウェブサイトが国を判断する際、1つの信号だけに頼ることはほとんどない。複数の信号を組み合わせており、その順序はサイトごとに異なる。ローカライゼーションQAを実施している場合やローカルページを監視している場合、これらの信号を知っておくと多くの混乱を避けられる。
このガイドでは、サイトが使う4つの信号、実際のサイトがそれらをどう組み合わせているかを検証した例、そして気になるサイトをチェックする方法を取り上げる。
4つの信号
| 信号 | 通常何を決めるか | どう制御するか |
|---|---|---|
| IPアドレス | 国、場合によっては言語 | プロキシの出口国 |
| Accept-Languageヘッダー | 国の中での言語 | ブラウザまたはクライアントの設定 |
| URL | 名指しされた内容を、他の要素より優先して決める | リクエストするアドレス |
| クッキーまたは保存された選択 | 前回選んだもの | クッキーの削除、または新しいセッション |
一部のサイトはサーバー側でこれらを一切使わず、代わりに訪問者自身に選ばせるページを表示する。
実際のサイトの挙動
2026年11月6日に、異なる国のレジデンシャルプロキシの出口と、異なるブラウザの言語設定を使って、いくつかの有名なページを読み込み、それぞれの出口国を個別に確認した。スクリプトは短く、必要なのはrequestsのみである。認証情報は環境変数から取得する。
from __future__ import annotations
import os
import re
import requests
GATEWAY = "p.shifter.io:443"
USER, PASSWORD = os.environ["PROXY_USER"], os.environ["PROXY_PASS"]
BROWSER = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/130.0 Safari/537.36")
def visit(url, country, language):
"""Load a URL from an exit in one country with one browser language."""
proxy = f"http://{USER}-country-{country}:{PASSWORD}@{GATEWAY}"
s = requests.Session()
s.proxies = {"http": proxy, "https": proxy}
s.headers.update({"User-Agent": BROWSER, "Accept-Language": language})
r = s.get(url, timeout=40)
lang = re.search(r'<html[^>]*\blang=["\']?([\w-]+)', r.text, re.I)
return r.url, lang.group(1) if lang else None
CASES = [
# url, exit country, Accept-Language
("https://www.netflix.com/", "us", "en-US"),
("https://www.netflix.com/", "de", "en-US"),
("https://www.netflix.com/", "de", "de-DE"),
("https://www.netflix.com/", "br", "en-US"),
("https://www.google.com/", "us", "en-US"),
("https://www.google.com/", "de", "en-US"),
("https://www.google.com/?hl=en", "de", "en-US"),
("https://www.apple.com/de/", "us", "en-US"),
("https://www.ikea.com/", "de", "de-DE"),
]
if __name__ == "__main__":
for url, country, language in CASES:
for attempt in range(3):
try:
final, lang = visit(url, country, language)
break
except requests.RequestException:
final, lang = "error", None
asked = url.replace("https://www.", "")
got = final.replace("https://www.", "")
print(f"{asked:22} exit {country.upper()} {language:6} -> {got:22} lang={lang}")
出力は、要求したアドレス、出口国とブラウザ言語、到達したページ、そのページの言語を示している。
netflix.com/ exit US en-US -> netflix.com/ lang=en
netflix.com/ exit DE en-US -> netflix.com/de-en/ lang=en
netflix.com/ exit DE de-DE -> netflix.com/de/ lang=de
netflix.com/ exit BR en-US -> netflix.com/br-en/ lang=en
google.com/ exit US en-US -> google.com/ lang=en
google.com/ exit DE en-US -> google.com/ lang=de
google.com/?hl=en exit DE en-US -> google.com/?hl=en lang=en-DE
apple.com/de/ exit US en-US -> apple.com/de/ lang=de-DE
ikea.com/ exit DE de-DE -> ikea.com/ lang=en
4つのサイト、4つの挙動。
NetflixはIPと言語の両方を使う。 出口が国別のパスを決め、ブラウザの言語がバリエーションを決めた。ドイツの出口と英語ブラウザの組み合わせでは/de-en/になり、ドイツ語ブラウザでは/de/になった。ブラジルの出口と英語ブラウザでは/br-en/になった。
GoogleはURLを1つに保ち、言語についてはIPに従う。 ドイツの出口では、ブラウザが英語でもドイツ語のページになった。URLに?hl=enを追加すると英語に切り替わったため、URLがIPより優先された。
AppleはURLに判断を委ねる。 米国の出口から/de/を要求すると、ドイツのサイトが表示された。IPによるリダイレクトは一切なかった。
IKEAはまったくリダイレクトしなかった。 ドイツの出口とドイツ語ブラウザの組み合わせでも、国際ページが英語で表示され、選択は訪問者に委ねられていた。
チェックへの意味
- 出口と言語を一緒に設定する。 ドイツ市場を英語ブラウザでテストすると、実際の訪問者が目にすることのない組み合わせの結果を得ることがある。Netflixの例がそれを示している。一部のサイトはタイムゾーンも確認するため、そこも合わせること。
- 最終的なURLを記録する。 要求したアドレスと到達したページはしばしば異なる。両方を保存し、リダイレクトを見逃さないようにする。
- 各市場を毎回フレッシュな状態で始める。 以前の訪問のクッキーがIPより優先されることがある。国ごとに新しいセッションを使うこと。
- URLだけを信用しない。 Googleのようなサイトでは、同じURLがIPによって異なるコンテンツを表示する。Appleのようなサイトでは、URLが決定要因でIPは関係ない。自分が扱っているのがどちらのタイプかをテストすること。
- なりたい訪問者に合わせて出口を選ぶ。 立地が重要になる場合とそうでない場合については、出口国の選び方に関する記事を参照のこと。
サイトを運営している場合
ジオリダイレクトは不利に働くことがある。Googleのガイダンスでは、ユーザーの言語だと思われるものに基づいて、あるバージョンから別の言語バージョンへ自動的にリダイレクトすることを避けるよう勧めている。それにより、ユーザーや検索エンジンがすべてのバージョンに到達できなくなる可能性があるためだ。また、Googlebotは通常米国のIPアドレスからクロールし、Accept-Languageヘッダーを送信しないため、位置情報によってコンテンツを適応させるサイトは、すべてのバージョンがインデックスされない可能性があるとも指摘している。
より安全なパターンは、上記のサイトの多くが何らかの形で採用しているものだ。国や言語ごとに別々のURLを用意し、訪問者の信号に基づいた提案を行い、簡単に切り替えられるようにすることである。
結論
ウェブサイトが考える「あなたがどこにいるか」は、IP、ブラウザの言語、URL、そして記憶の組み合わせであり、サイトごとに組み合わせ方が異なる。ページが間違った国を表示したら、プロキシのせいにする前にこの4つをすべて確認すること。そしてテストする際は、一度に1つの信号だけを変え、サイトがどれに従っているのかを把握すること。
出典と参考文献
- Google Search Central, Managing multi-regional and multilingual sites: developers.google.com
- Google Search Central, How Google crawls locale-adaptive pages: developers.google.com