はじめに
自社のコーポレートサイトを静的サイトとしてビルドし、Cloudflare Workers(Custom Domains)で公開しました。
公開して数日後、Google Search Console の「HTTPS」レポートを開くと、次のように表示されていました。
- HTTPS 以外の URL:1(1 件の重大な問題)
- HTTPS URL:0
- 理由:「HTTPS が評価されていません」
サイトは HTTPS で問題なく表示できていたため最初は戸惑いましたが、原因はシンプルでした。
同じようにハマる方がいるかもしれないので、調査と対処の手順をまとめます。
環境
- 静的サイト(Node.js のビルドスクリプトで HTML / sitemap.xml / robots.txt を生成)
- ホスティング:Cloudflare Workers
- Custom Domains に
example.comとwww.example.comの 2 つを登録
※ 以下、ドメインは example.com に置き換えています。
まずは curl で現状確認
ブラウザで見ていると気づきにくいので、HTTP / HTTPS と www あり / なしの 4 パターンを curl で確認しました。
for u in http://example.com/ https://example.com/ \
http://www.example.com/ https://www.example.com/; do
echo "== $u"
curl -sI "$u" | grep -iE '^(HTTP|location)'
done
結果はこうでした。
== http://example.com/
HTTP/1.1 200 OK
== https://example.com/
HTTP/1.1 200 OK
== http://www.example.com/
HTTP/1.1 200 OK
== https://www.example.com/
HTTP/1.1 200 OK
全部 200 で、リダイレクトが 1 つもありません。
<link rel="canonical"> も sitemap も https://example.com/ を指していましたが、
HTTP 版と www 版がそのまま同じ内容を返していたため、Google から見ると
「HTTP で配信されているページ」「重複したページ」が存在する状態でした。
原因
Workers の Custom Domains にドメインを追加しただけでは、次の 2 つは自動では設定されません。
- HTTP → HTTPS のリダイレクト
- www → www なし(またはその逆)への正規化
どちらも Worker 側ではなく、ゾーン(ドメイン)側の設定です。
Workers & Pages の画面をいくら探しても見つからないので注意してください。
対処 1:Always Use HTTPS を有効化
Workers & Pages の Domains タブにある Zone 列のドメイン名をクリックすると、ゾーンのダッシュボードへ移動できます。
- 左メニュー SSL/TLS → Edge Certificates
- Always Use HTTPS を ON にする
- ついでに SSL/TLS → Overview で暗号化モードが Flexible になっていないか確認する(Full / Full (strict) 推奨)
対処 2:Redirect Rules で www を正規化
- 左メニュー Rules → Redirect Rules(Overview → Create rule から作成)
- 条件:
Hostnameequalswww.example.com - URL リダイレクト:
- Type:Dynamic
- Expression:
concat("https://example.com", http.request.uri.path) - Status code:301
- Preserve query string:ON
Redirect Rules は Worker より前の段階で評価されるため、
www.example.com を Workers の Custom Domains に残したままでもリダイレクトされます。
確認
もう一度 curl を実行します。
== http://example.com/
HTTP/1.1 301 Moved Permanently
Location: https://example.com/
== https://www.example.com/
HTTP/1.1 301 Moved Permanently
Location: https://example.com/
正規 URL(https://example.com/)だけが 200 を返し、それ以外はすべて 301 で集約されるようになりました。
おまけ:sitemap.xml と robots.txt はビルド時に生成する
静的サイトの場合、sitemap は手書きせず、ページ定義からビルド時に生成しておくと更新漏れがありません。
今回のサイトでは次のような関数で出力しています。
export function renderSitemap(siteUrl) {
const base = siteUrl.replace(/\/$/, "");
return `<?xml version="1.0" encoding="UTF-8"?>` +
`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` +
pages().map((p) => `<url><loc>${escape(base + p.path)}</loc></url>`).join("") +
`</urlset>`;
}
export function renderRobots(siteUrl) {
return `User-agent: *\nAllow: /\n\nSitemap: ${siteUrl.replace(/\/$/, "")}/sitemap.xml\n`;
}
ポイントは、sitemap の <loc> と canonical を リダイレクト後の正規 URL(https・www なし)に揃える ことです。
ここがずれていると、Google に矛盾したシグナルを送ってしまいます。
Search Console 側でやること
-
インデックス作成 → サイトマップ で
sitemap.xmlを送信する - URL 検査 でトップページを入力し、「公開 URL をテスト」で「URL は Google に登録できます」になることを確認する
- 同じ画面の「インデックス登録をリクエスト」を押す(テキストリンクのように見えますがボタンです)
- HTTPS レポートで検証が「開始」になっていれば、あとは再クロールを待つ
なお「URL が Google に登録されていません」「HTTPS が評価されていません」は、
新しいサイトではまだクロールされていないだけ、ということも多いです。
慌てずに、まずはリダイレクトと sitemap を整えておくのが近道でした。
まとめ
- Cloudflare Workers の Custom Domains だけでは、HTTP→HTTPS と www の正規化はされない
- 設定場所は Worker ではなく ゾーン側(SSL/TLS と Rules)
- curl で 4 パターンを確認すると、問題が一目でわかる
- sitemap・canonical・リダイレクト先の URL を 1 つに揃える
同じ構成でサイトを公開している方の参考になれば幸いです。
この記事の構成で公開しているサイト:智届科技
(電力・エネルギー分野の EMS / AI 関連の開発をしています)