0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloudflare Workers で公開した静的サイトが Search Console で「HTTPS 以外の URL」と言われた件と対処

0
Posted at

はじめに

自社のコーポレートサイトを静的サイトとしてビルドし、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 つは自動では設定されません。

  1. HTTP → HTTPS のリダイレクト
  2. www → www なし(またはその逆)への正規化

どちらも Worker 側ではなく、ゾーン(ドメイン)側の設定です。
Workers & Pages の画面をいくら探しても見つからないので注意してください。

対処 1:Always Use HTTPS を有効化

Workers & Pages の Domains タブにある Zone 列のドメイン名をクリックすると、ゾーンのダッシュボードへ移動できます。

  1. 左メニュー SSL/TLS → Edge Certificates
  2. Always Use HTTPS を ON にする
  3. ついでに SSL/TLS → Overview で暗号化モードが Flexible になっていないか確認する(Full / Full (strict) 推奨)

対処 2:Redirect Rules で www を正規化

  1. 左メニュー Rules → Redirect Rules(Overview → Create rule から作成)
  2. 条件:Hostname equals www.example.com
  3. 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 側でやること

  1. インデックス作成 → サイトマップ で sitemap.xml を送信する
  2. URL 検査 でトップページを入力し、「公開 URL をテスト」で「URL は Google に登録できます」になることを確認する
  3. 同じ画面の「インデックス登録をリクエスト」を押す(テキストリンクのように見えますがボタンです)
  4. HTTPS レポートで検証が「開始」になっていれば、あとは再クロールを待つ

なお「URL が Google に登録されていません」「HTTPS が評価されていません」は、
新しいサイトではまだクロールされていないだけ、ということも多いです。
慌てずに、まずはリダイレクトと sitemap を整えておくのが近道でした。

まとめ

  • Cloudflare Workers の Custom Domains だけでは、HTTP→HTTPS と www の正規化はされない
  • 設定場所は Worker ではなく ゾーン側(SSL/TLS と Rules)
  • curl で 4 パターンを確認すると、問題が一目でわかる
  • sitemap・canonical・リダイレクト先の URL を 1 つに揃える

同じ構成でサイトを公開している方の参考になれば幸いです。


この記事の構成で公開しているサイト:智届科技
(電力・エネルギー分野の EMS / AI 関連の開発をしています)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?