2026年7月21日
2026年7月21日
PunycodeとIDN(日本語ドメイン)の使い分け:設定ファイル・SSL・WordPress・SEOでどちらを書くか
IDN(日本語ドメインなどの国際化ドメイン名)と Punycode(xn-- で始まる英数字の表記)は、同じドメインを人向けに書くか、機械向けに書くかの違いです。使い分けの原則は、「人が読む場所は日本語のIDN、サーバー・DNS・証明書・プログラムの設定は Punycode」です。この記事では、場所ごとにどちらを書けばよいか、変換の方法、WordPressで設定するときの注意、検索エンジンでの扱いを説明します。
IDNとPunycodeの関係
DNSは、もともと英数字とハイフンしか扱えない仕組みです。そこで、日本語などを含むドメイン名を英数字の並びに変換して扱う規格が作られました。
- IDN(Internationalized Domain Name):
日本語.jpのように、英数字以外の文字を含むドメイン名 - Punycode: IDNを英数字に変換する方式、およびその表記。変換後の各ラベルには
xn--が付きます
たとえば 日本語.jp を Punycode に変換すると xn--wgv71a119e.jp になります。両者は表記が違うだけで、DNS上は同じ1つのドメインです。ブラウザのアドレス欄に日本語で入力しても、ブラウザが内部で Punycode に変換してから名前解決しています。
場所ごとの使い分け
Punycode で書く場所
機械が読む設定は Punycode で書くのが原則です。日本語のまま書いても自動で変換してくれるソフトもありますが、変換しないものが混ざると、そこだけ動かないという原因の分かりにくい不具合になります。
- DNSのゾーン設定: 権威DNSの管理画面によっては日本語入力を受け付けて変換しますが、ゾーンファイルを直接書く場合は Punycode です。
- Webサーバーの設定: nginx の
server_name、Apache のServerName/ServerAliasは Punycode で書きます。ブラウザから届くリクエストのHostヘッダーも Punycode です。 - SSL証明書: 証明書のSAN(有効なホスト名の欄)には Punycode の形で記載されます。CSRを作るときも Punycode で指定するのが確実な方法です。
- プログラムや設定ファイル: リダイレクト設定、CORSの許可リスト、外部サービスのコールバックURLなども Punycode にそろえます。
server {
listen 443 ssl;
server_name xn--wgv71a119e.jp www.xn--wgv71a119e.jp; # 日本語.jp
# ...
}
設定ファイルにはコメントで日本語の表記を併記しておくと、後から見た人が取り違えずに済みます。
IDN(日本語)で書く場所
人が読み書きする場所では、日本語のまま見せるのが IDN を使う意味です。
- 名刺、チラシ、看板、テレビやラジオでの読み上げ
- 会社案内や記事本文の中でサイト名を紹介するとき
- 電話で口頭で伝えるとき
ただし、URLをコピーして貼り付けると、環境によって Punycode や % でエンコードされた長い文字列に変わることがあります。メールやSNSでリンクを共有する場面では、その見え方も想定しておきます。
メールアドレスは英数字のドメインを使う
日本語ドメインをメールアドレスに使うこと(info@日本語.jp)は、規格上は可能ですが、送受信の両側が対応している必要があり、対応状況にはばらつきがあります(2026年10月現在)。問い合わせ先や通知の送信元には、英数字のドメイン、または Punycode 表記のアドレスを使うのが無難です。WordPress の is_email() も、ドメイン部分に英数字とハイフンを想定した判定をしているため、日本語のままのアドレスは無効と判定されます。
変換の方法
手元で変換するには、次の方法があります。
# libidn2 の idn2 コマンド
idn2 日本語.jp # → xn--wgv71a119e.jp
idn2 -d xn--wgv71a119e.jp # → 日本語.jp
# Python(標準の idna コーデック)
python3 -c "print('日本語.jp'.encode('idna').decode())"
PHP では intl 拡張の idn_to_ascii() と idn_to_utf8() が使えます。
<?php
$ascii = idn_to_ascii( '日本語.jp', IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46 );
$utf8 = idn_to_utf8( 'xn--wgv71a119e.jp', IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46 );
変換の規格には古い版(IDNA2003)と新しい版(IDNA2008)があり、ごく一部の文字で結果が異なります。Python 標準の idna コーデックは古い版に基づくため、特殊な文字を含む場合は IDNA2008 に対応したライブラリで確かめます。一般的な日本語の文字であれば、どちらでも同じ結果になります。
WordPressで日本語ドメインを使うとき
WordPressの「設定」→「一般」にある「WordPress アドレス (URL)」と「サイトアドレス (URL)」は、Punycode で登録しておくのが問題の起きにくい方法です。日本語のまま保存できる場合もありますが、プラグインや外部サービスによっては日本語のホスト名を正しく扱えず、リダイレクトのループやリンク切れの原因になることがあります。
設定を変更する前には、データベースとファイルのバックアップを取ってください。変更後にログインできなくなった場合に備えて、wp-config.php に WP_HOME と WP_SITEURL を定義すれば管理画面を経由せずに値を戻せることも覚えておくと安心です。運用中のサイトでアドレスを変える場合は、記事内のURLの置換や301リダイレクトも必要になるため、ステージング環境で手順を確かめてから本番に反映します。
検索エンジン(SEO)での扱い
Google などの検索エンジンは IDN をクロール・インデックスでき、検索結果では日本語の表記で表示されることが一般的です。IDN と Punycode は同じホストとして扱われるため、どちらで書いたかで別のサイトとみなされることはありません。
一方で、次の点は誤解されやすいところです。
- ドメイン名に日本語のキーワードを入れても、順位が上がるとは限りません。 ドメイン名に含まれる語の効果を期待して日本語ドメインを選ぶのではなく、覚えやすさや伝えやすさで選びます。
- 表記はサイト全体でそろえます。 canonical、XMLサイトマップ、hreflang、内部リンクのURLは、WordPress のサイトアドレスと同じ表記(Punycode を推奨)に統一します。表記が混在しても多くの場合は同じホストとして処理されますが、ツールによっては別URLとして集計され、確認作業が煩雑になります。
- Search Console では、DNSで所有権を確認する「ドメイン」プロパティを使うと、表記の違いを意識せずに登録できます。
よく使われる構成は、英数字のドメインをメインのサイトにし、日本語ドメインは広告や案内用として取得し、メインのドメインへ301リダイレクトする方法です。日本語ドメイン側にも証明書を用意しないと、HTTPSでアクセスされたときにリダイレクトの前にエラーになる点に注意してください。
見た目の似たドメインに注意する
IDN では、見た目がよく似た別の文字を使って、正規のドメインになりすます手口(ホモグラフ攻撃)があります。主要なブラウザは、複数の文字種が不自然に混在しているなど疑わしい場合に、日本語ではなく Punycode で表示する仕組みを持っています。自社のドメインに似せた日本語ドメインが使われていないか気になる場合は、ブランド名に近い表記を事前に取得しておくことも選択肢の一つです。
まとめ
- IDN と Punycode は同じドメインの表記違いです。人が読む場所は IDN、DNS・Webサーバー・SSL証明書・プログラムの設定は Punycode で書きます。
- メールアドレスは日本語ドメインの対応状況にばらつきがあるため、英数字のドメインを使うのが無難です。
- WordPress のサイトアドレスは Punycode で登録し、canonical やサイトマップの表記もそろえます。
- 日本語ドメインにしても順位が上がるとは限りません。伝えやすさで選び、案内用に取得して301リダイレクトする構成もよく使われます。