<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Prerender.io on qwerty.work</title>
        <link>https://qwerty.work/tags/prerender.io/</link>
        <description>Recent content in Prerender.io on qwerty.work</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja-JP</language>
        <lastBuildDate>Sat, 19 Apr 2025 00:09:27 +0900</lastBuildDate><atom:link href="https://qwerty.work/tags/prerender.io/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Cloudflare Workers &#43; Prerender.io で CSRサイトを SEO 対応する方法</title>
            <link>https://qwerty.work/post/2025/04/cloudflare-workers-prerenderio-csr-seo/</link>
            <pubDate>Sat, 19 Apr 2025 00:09:27 +0900</pubDate>
            <guid>https://qwerty.work/post/2025/04/cloudflare-workers-prerenderio-csr-seo/</guid>
            <description>&lt;h2 id=&#34;このページの概要&#34;&gt;このページの概要&#xA;&lt;/h2&gt;&lt;p&gt;Javascriptを多用したサイトや、ノーコードツールで制作したサイトがGoogle Search ConsoleではGoogleにインデックスされましたが、Bing Webmaster Toolsに登録してもBingにインデックスできないことが多々あります。Bingでは最初は空ページで、Javascriptが後からコンテンツを読み込んでくるページは認識しないみたいです。そこで、事前にレンダリングされた静的ページのキャッシュを用意し、検索エンジンのクローラーからのアクセスはそのキャッシュに誘導してページコンテンツを認識させるといった方法があったのでメモ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;目的&#34;&gt;目的&#xA;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;- クライアントサイドレンダリング（CSR）で動作するJavaScriptサイトを Google や Bing にインデックスさせる&#xA;- クローラー（bot）にだけ静的HTMLを返す仕組みを構築する&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;必要なものすべて無料で始められます&#34;&gt;必要なもの（すべて無料で始められます）&#xA;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;- [Cloudflare](https://www.cloudflare.com/) アカウント&#xA;- [GitHub](https://github.com/) アカウント&#xA;- [Prerender.io](https://prerender.io/) アカウント&#xA;- 対象ドメインのDNSを Cloudflare DNS に変更すること&#xA;- コマンド実行環境（Windows: PowerShell / macOS/Linux: ターミナル）&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;ざっくりとした仕組みの流れ&#34;&gt;ざっくりとした仕組みの流れ&#xA;&lt;/h2&gt;&lt;p&gt;Prerender.ioで静的ページのキャッシュを作成し、CloudFlareのWorkersを使って検索ボットのアクセスはPrerender.ioのキャッシュに誘導し、それ以外のアクセスは通常サイトが配信されるようにします。これを行うためにはCloudFlare Workersに登録するスクリプトをGitHubまたはGitLabに置き、それを読み込ませます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;手順&#34;&gt;手順&#xA;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;- Prerender.io に登録し、APIトークンを取得&#xA;- Cloudflare にドメインを追加（ネームサーバー変更）&#xA;- GitHub に新しいリポジトリを作成（例: `cf-prerender-multisite`）&#xA;- 以下の 2 ファイルを作成して GitHub に push&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;srcindexjs&#34;&gt;src/index.js&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export default {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  async fetch(request, env, ctx) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    const url = new URL(request.url)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    const pathname = url.pathname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    const userAgent = request.headers.get(&amp;#34;user-agent&amp;#34;) || &amp;#34;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    const isBot = /bot|crawl|spider|slurp|bing/i.test(userAgent)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    // .xml や .txt で終わるパスは除外（Prerender.ioを経由させない）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    const isStaticFile = pathname.endsWith(&amp;#34;.xml&amp;#34;) || pathname.endsWith(&amp;#34;.txt&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    if (isStaticFile) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      return fetch(request)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    const token = &amp;#34;YOUR_API_TOKEN&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    if (isBot) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      const prerenderUrl = `https://service.prerender.io/https://${url.hostname}${url.pathname}${url.search}`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      return fetch(prerenderUrl, {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        headers: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &amp;#39;X-Prerender-Token&amp;#39;: token&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    return fetch(request)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;wranglertoml&#34;&gt;wrangler.toml&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name = &amp;#34;prerender-multisite&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;main = &amp;#34;src/index.js&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;compatibility_date = &amp;#34;2024-04-15&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[routes]]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pattern = &amp;#34;example.com/*&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zone_name = &amp;#34;example.com&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;- Cloudflare Pages に GitHub を接続して「空のWorker」としてデプロイ&#xA;- Cloudflare DNS の A レコードで ☁️（プロキシ）を ON にする&#xA;- Cloudflare の「SSL/TLS」を フル（Strict） に変更（リダイレクトループ回避）&#xA;- Cloudflare の対象ドメイン選択した中の Wokers＆Pages の編集で「リクエスト制限失敗モード」と「失敗オープン (続行)」に変更（504エラー対応）&#xA;- Cloudflare Caching 構成 で Crawler Hints を ON にする（Index Now 対応）&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;デバッグ方法powershell--ターミナルで実行&#34;&gt;デバッグ方法（PowerShell / ターミナルで実行）&#xA;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;- Googlebot になりすましてHTMLを取得&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -A &amp;#34;Googlebot&amp;#34; https://example.com/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;- ヘッダーのみを取得してステータス確認&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -A &amp;#34;Googlebot&amp;#34; -I https://example.com/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;- Prerender.io に直接アクセスしてHTMLを確認&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &amp;#34;X-Prerender-Token: YOUR_API_TOKEN&amp;#34; &amp;#34;https://service.prerender.io/https://example.com/&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;- Cloudflare ダッシュボードの「Workerログ」でリクエスト確認&#xA;- Chromeのデベロッパーツールで User-Agent を Googlebot に変更して動作確認&#xA;- [Prerender.io Dashboard](https://prerender.io/dashboard) の「Recently Cached Pages」を確認&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;成功時のレスポンス例&#34;&gt;成功時のレスポンス例&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HTTP/1.1 200 OK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Server: cloudflare&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;X-Prerender-Requestid: xxxxxxxx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;X-Prerender-External-Lb: haproxy-private-cache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&#xA;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;- Cloudflare Worker + Prerender.io の組み合わせで SEO に強い構成が実現&#xA;- 通常ユーザーには動的なSTUDIOサイト、Botには高速なHTMLを返す&#xA;- すべて無料で始められ、Cloudflare上で完結するため保守も簡単&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;結果&#34;&gt;結果&#xA;&lt;/h2&gt;&lt;p&gt;Bing検索のインデックスに成功しました。トータルで約1週間ほどかかりました。経過として、この方法でBing Webmaster Toolsで改めて「URL検査」メニューから「インデックス作成を要求」を実行して、4～5日後にステータスが「正常にインデックスが付きました」に変わりました。しかし、すぐにはBing検索の結果に表示されず、それから約3日後に検索結果として表示されるようになりました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その他の選択肢&#34;&gt;その他の選択肢&#xA;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;- &#xA;  [Cloudflare Browser Rendering](https://developers.cloudflare.com/browser-rendering/)  &#xA;  公式のヘッドレスブラウザ機能。Cloudflare Workersと統合可能ですが、Prerender.ioよりやや設定が複雑です。&#xA;&#xA;- &#xA;  [Rendertron](https://github.com/GoogleChrome/rendertron)  &#xA;  Google製のオープンソースレンダラー。自前でデプロイが必要（[Google Cloud Run](https://cloud.google.com/run) などを使用）。&#xA;&#xA;- &#xA;  Firebase Hosting + SSR や Next.js の Incremental Static Regeneration（ISR）など、フレームワーク側でのSEO対策も手段の一つです。&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;その後の実験&#34;&gt;その後の実験&#xA;&lt;/h2&gt;&lt;p&gt;無事にBingに登録されましたが、登録後にDNSサーバーを元に戻し、Cloudflare WorkersとPrerender.ioの仕組みを外した場合、Bingボットが改めてページをクロールしたらどうなるか実験したいと思います。数ヶ月かかるかもしれないので、履歴を書いておきます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2025-04-25　Bing Webmaster ToolsのURL検索で表示が「正常にインデックスが付きました　URL は Bing に表示できます」となった&lt;/li&gt;&#xA;&lt;li&gt;2025-04-26　Bing検索で検索結果に表示されたのを確認&lt;/li&gt;&#xA;&lt;li&gt;2025-04-28　DNSサーバーをお名前ドットコムに戻した&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
