wwwあり・なしを統一する — 入口は4つある。自分のサイトを測ってから直す
先に結論
wwwの有無だけの問題ではありません。
http / https と組み合わせると、入口は4通りあります。
全部が1つの正規URLに着地していないと、同じ内容が複数のURLに存在することになります。
| wwwなし | wwwあり | |
|---|---|---|
http | http://example.com/ | http://www.example.com/ |
https | https://example.com/ | https://www.example.com/ |
やることは3つです。
| 内容 | |
|---|---|
| 1. 測る | 4つの入口がどこに着地するかを実際に確かめる(詳しく) |
| 2. 寄せる | 正規URL以外から301で転送する(詳しく) |
| 3. 揃える | rel="canonical"・サイトマップ・内部リンクを正規URLに統一する |
Search Consoleの「優先ドメイン」の設定を案内している解説がありますが、 その設定は2019年に廃止されています(詳しく)。 いま探しても画面にありません。
入口は4つある
組み合わせを数える
「wwwあり・なしの統一」という言い方だと2択に見えますが、実際には掛け算になります。
| 要素 | 通り | 例 |
|---|---|---|
| ホスト名 | 2 | example.com / www.example.com |
| プロトコル | 2 | http / https |
| ここまでで | 4通り | |
| 末尾スラッシュ | (×2) | /about / /about/ |
| index.html の有無 | (×2) | / / /index.html |
この記事で扱うのは最初の4通りです。
末尾スラッシュと index.html も同じ考え方で潰せますが、
まず4通りが1つに着地していることを確かめるのが先です。
両方を200で出してはいけない
サーバーの設定で、wwwありとwwwなしの両方に同じディレクトリを割り当てる書き方があります。
Apacheなら ServerAlias を足すだけです。
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com # ← これで両方が同じ内容を返す
DocumentRoot /var/www/example
</VirtualHost>
これは「動く」設定ですが、やってはいけない形です。
どちらのホスト名でも 200 が返るので、
検索エンジンから見ると同じ内容のページが2つのURLに存在します。
| 起きること | 内容 |
|---|---|
| 評価が分かれる | 被リンクが2つのURLに分散する |
| どちらが出るか決まらない | 検索結果に出るURLが安定しない |
| 計測が割れる | アクセス解析で別サイト扱いになる |
| Cookieが共有されない場合がある | ログイン状態がホスト名をまたがない |
ServerAlias を使うこと自体は間違いではありません。
受け付けたうえで301で片方に転送するなら、むしろそれが正しい形です。
受け付けて、そのまま返してしまうのが問題です。
Search Consoleの優先ドメイン設定は廃止された
「Search Consoleで優先ドメインを設定する」という手順を載せている解説が、いまも残っています。 その設定は2019年6月に廃止されました。
「Googleは設定の一つである優先ドメインを廃止します」
「Search Consoleの既存の優先ドメイン構成は使用されなくなります」
— 優先ドメインの設定を廃止(Google Search Central Blog・2019年6月18日)
「設定してあるから大丈夫」も成り立ちません。 既存の設定も使われなくなった、と書かれています。
同じ記事で、代わりの方法が4つ挙げられています。
| 方法 | 性質 |
|---|---|
廃止するURLに 301 リダイレクト | 最も強い。利用者も正規URLに着地する |
rel="canonical" リンクタグ | HTMLに書く。転送はしない |
rel="canonical" HTTPヘッダー | HTML以外(PDF等)でも使える |
| サイトマップ | 補助。これだけでは弱い |
基本は301です。
rel="canonical" は「こちらが正規です」と伝えるだけで、
利用者は非正規のURLに留まります。
301なら、人もクローラーも同じURLに着地します。
まず自分のサイトを測る
測り方
設定を書く前に、いまどうなっているかを確かめます。 4つの入口それぞれが、どこに、何回の転送で着地するかを見ます。
# 転送を追いかけて、最終URLとホップ数を出す
for u in "http://example.com/" "http://www.example.com/" \
"https://example.com/" "https://www.example.com/"; do
curl -sS -o /dev/null -L --max-time 20 \
-w "%{num_redirects} hops $u → %{url_effective} (%{http_code})\n" "$u"
done
転送の中身まで見るなら、1段ずつ追います。
# 1段目だけ見る(-L を付けない)
curl -sS -o /dev/null -w "%{http_code} → %{redirect_url}\n" "http://www.example.com/"
ホップ数に差が出た
実際に測ると、同じ「wwwなしに統一」でも構成が違うことが分かります。
| 構成 | 連鎖 | ホップ |
|---|---|---|
| 2段階 | http://www. →(301)→ https://www. →(301)→ https:// | 2 |
| 1発 | http://www. →(301)→ https:// | 1 |
2段階になるのは、HTTPS化の転送とホスト統一の転送を別々に書いているからです。 大手のサイトでも2段階が普通にあります。実際に測った例を挙げます。
| 入口 | 連鎖 | ホップ |
|---|---|---|
http://www.github.com/ | → https://www.github.com/ → https://github.com/ | 2 |
http://wikipedia.org/ | → https://wikipedia.org/ → https://www.wikipedia.org/ | 2 |
2ホップが致命的なわけではありません。 ただし転送1回ぶんの往復は確実に遅くなるので、1発で寄せられるならそのほうがよいです。 書き方は後述します。
1段目が302になっていないか
ホップ数より大事なのがこちらです。
手元で運用しているサイト10件の、http:// からの1段目を測りました。
| 1段目のステータス | 件数 | 評価 |
|---|---|---|
301(恒久的) | 8 | 正しい |
302(一時的) | 2 | 直したほうがよい |
HTTPS化の転送は、恒久的なものです。
http:// に戻す予定はありません。それなのに 302 で返していると、
「一時的なので、元のURLを正規として扱ってください」と言っていることになります。
301 | 302 | |
|---|---|---|
| 意味 | 恒久的に移動した | 一時的にこちらを見て |
| 正規URLの扱い | 転送先が正規 | 転送元が正規のまま |
| ブラウザのキャッシュ | 記憶する | 記憶しない(毎回聞きに行く) |
| HTTPS化・www統一に | こちらを使う | 使わない |
10件中2件が302でした。
どちらも「HTTPS化はできている」ので、画面を見ているだけでは気づきません。
curl で1行測るだけで分かります。一度は確認してください。
末尾スラッシュも同じ問題
4つの入口を潰したら、次に出てくるのが末尾スラッシュです。
/docs/Web と /docs/Web/ は、URLとしては別物です。
どちらでも同じ内容が200で返るなら、さっきと同じ問題が起きます。
実際に測ると、きちんと寄せているサイトが分かります。
| URL | 結果 |
|---|---|
developer.mozilla.org/ja/docs/Web | 200(こちらが正規) |
developer.mozilla.org/ja/docs/Web/ | 301 → スラッシュ無しへ |
docs.github.com/ja | 200(こちらが正規) |
docs.github.com/ja/ | 301 → スラッシュ無しへ |
どちらも「スラッシュ無しが正規」と決めて、有りを301で寄せています。 逆に「有りを正規」にしているサイトもあります。どちらでも構いません。決まっていることが大事です。
ただし、ディレクトリを配信している場合は話が別です。
/about/ のようにディレクトリへのアクセスは、
Webサーバーがスラッシュ付きに301で寄せるのが既定の動作です。
これを無理に変えると、サーバー側の既定と喧嘩して無限ループの原因になります。
ディレクトリはスラッシュ有り、拡張子なしの単独URLはスラッシュ無し、と使い分けるのが素直です。
確認は、さっきと同じ curl で足ります。
代表的なページを数本、両方の形で叩いてみてください。
片方が301で寄っていれば正常、両方とも200なら直す対象です。
どちらに寄せるか
SEO上の有利・不利はありません。どちらでも構いません。 決める材料は別のところにあります。
| 条件 | 向き | 理由 |
|---|---|---|
| すでに運用していて、被リンクが片方に多い | 多いほう | これが最優先。転送でも引き継がれるが、わざわざ減らす理由がない |
| サブドメインを多用する | wwwあり | Cookieのスコープを分けやすい |
| URLを短く見せたい | wwwなし | 名刺や広告での見栄え |
| 新規で、こだわりがない | どちらでも | 決めて、二度と変えないことのほうが大事 |
1行目を先に確認してください。 すでに公開しているサイトなら、外部からリンクされている側に寄せるのが素直です。
設定を書く
HTTPS化とホスト統一を1つのルールにまとめると、1ホップで済みます。
# Apache(.htaccess):www なし + https に、1発で寄せる
<IfModule mod_rewrite.c>
RewriteEngine On
# https でない、または www が付いている場合はまとめて転送
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
</IfModule>
Nginxなら、転送専用のサーバーブロックを置きます。
# Nginx:http と www を1発で https・www なしへ
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
# http の非www もここで受ける
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
root /var/www/example;
# 本体の設定
}
| 要点 | 理由 |
|---|---|
R=301 にする | 恒久的な転送。302 だと正規URLが移らない(表9) |
%{REQUEST_URI} を付ける | 付け忘れると全ページがトップに飛ぶ |
条件を [OR] でまとめる | HTTPS化とホスト統一を1ホップにできる |
| www側にもHTTPSの証明書が要る | https://www. で来た人を受けるため。忘れると警告が出る |
| 転送先をハードコードする | 正規ホストを1か所に書く。変数で組むと事故りやすい |
4行目を見落としがちです。
「wwwなしに統一するから、www側は要らない」と思いがちですが、
転送するためには、まず https://www. で接続できなければいけません。
証明書が www を含んでいないと、転送する前に警告画面が出ます。
無料の証明書でも、両方のホスト名を入れて取得してください。
踏みやすい罠
| 症状 | 原因 |
|---|---|
| 全ページがトップに飛ぶ | %{REQUEST_URI} を付けていない |
| 無限リダイレクト | 転送先でも条件が成立している。[OR] の組み方を見直す |
https://www. で警告が出る | 証明書に www が入っていない |
| 一度直したのに古い方に飛ぶ | 301がブラウザに記憶されている。別のブラウザか履歴を消して確認する |
| POSTが壊れる | 301はPOSTをGETに変える(詳しく)。APIのパスは転送対象から外す |
| 内部リンクが古いホスト名のまま | 転送はされるが、毎回1ホップ余計にかかる |
| サイトマップが古いホスト名 | クローラーが毎回転送を踏む |
最後の2行は、転送を書いたあとに残りやすい宿題です。
転送があるので動いてはいますが、毎回1ホップぶん遅くなります。
rel="canonical"・サイトマップ・内部リンクも、正規URLに書き換えてください。
AIに任せるときの注意
| 頼むこと | 向くか | 理由 |
|---|---|---|
curl の出力を貼って「どこに着地している?」 | 向く | 連鎖を読むだけ |
| 「HTTPS化とwww統一を1つのルールにまとめて」 | 向く | 定型。条件の組み方は機械的 |
| いまの設定を貼って「無限ループの原因は?」 | 向く | 条件の重なりは読めば分かる |
| 「wwwあり・なしの統一方法を教えて」 | 向かない | 廃止済みのSearch Consoleの設定が返ってくる |
| 「どちらに寄せるべき?」 | 向かない | 被リンクがどちらに多いかで決まる(表11)。一般論では決まらない |
| 設定ファイルを直接書き換えさせる | 向かない | 書き損じると全ページが落ちる。控えを取って自分で適用する |
判定の目安です。答えに「Search Consoleで優先ドメインを設定」が出てきたら、情報が古いと思ってください。
よくある質問
wwwはありとなし、どちらがSEOに有利ですか
差はありません。どちらかに統一されていることが大事です。 すでに運用しているなら、被リンクが多いほうに寄せるのが素直です(表11)。
Search Consoleの優先ドメインが見つかりません
2019年6月に廃止されました(Google公式)。 既存の設定も使われなくなった、と明記されています。301で寄せてください。
両方のURLで表示できていれば問題ないのでは
問題があります。同じ内容が2つのURLに存在する状態になり、 評価も計測も分かれます(表4)。 受け付けるのは構いませんが、受け付けたら301で寄せてください。
canonicalタグだけではだめですか
Googleが挙げている手段の1つではあります(表5)。 ただし転送はしないので、利用者は非正規のURLに留まります。 301なら人もクローラーも同じURLに着地します。301が基本です。
302ではだめですか
だめです。302は「転送元が正規のまま」という意味になります(表9)。 HTTPS化やwww統一は恒久的な変更なので301です。 実測した10サイト中2件が302でした。画面を見ているだけでは気づきません。
ホップ数は少ないほうがいいですか
少ないほうがいいですが、2ホップが致命的ではありません。 実測した範囲では、よく知られたサイトでも2ホップでした(表7)。 HTTPS化とホスト統一を1つのルールにまとめれば1ホップになります(詳しく)。
全ページがトップページに飛びます
転送先に %{REQUEST_URI} を付けていません(表13)。
パスを引き継がないと、どのページから来てもトップに着地します。
https://www. で証明書の警告が出ます
証明書に www が含まれていません。 転送するにも、まず接続できる必要があります(表12)。 両方のホスト名を入れて取り直してください。
直したのに古いほうに飛びます
301がブラウザに記憶されています。
別のブラウザか、シークレットウィンドウで確認してください。
curl なら記憶しないので確実です。
まとめ
- 入口は4つある。wwwの有無 ×
http/https。全部が1つに着地しているか確かめる。 - 両方を200で出してはいけない。受け付けるのは構わないが、受けたら301で寄せる。
- Search Consoleの優先ドメイン設定は2019年6月に廃止された。既存の設定も使われない(Google公式)。
- Googleが挙げる代替は4つ。基本は301。
rel="canonical"は転送しないので利用者は残る。 - 設定を書く前に測る。
curl4行で、どこに何ホップで着地するかが分かる。 - ホップ数より、1段目が301かどうかが大事。実測した10サイト中2件が302だった。
- 302は「転送元が正規のまま」という意味。HTTPS化もwww統一も恒久的な変更なので301。
- HTTPS化とホスト統一を1つのルールにまとめれば1ホップになる。
%{REQUEST_URI}を忘れない。忘れると全ページがトップに飛ぶ。- www側にも証明書が要る。転送するにも、まず接続できる必要がある。
301がPOSTをGETに変える話は Vue 3 で axios の POST が思ったとおりに動かない、
同じ .htaccess を触る話は .htaccessでスマホとPCを振り分ける と
サイトが文字化けするときの直し方、
サーバー選びは レンタルサーバーおすすめ8選 に書きました。
転送の連鎖とステータスコードは、2026年10月25日に curl で実際に取得したものです
(10サイトの内訳はサイト名を伏せています)。設定は変わります。
サーバーの設定を変更する前に必ず控えを取り、本番ではないところで試してください。
.htaccess を書き損じると全ページが表示できなくなります。