&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stan Wu 吳信典</title><link>https://blog.stanwu.org/tags/facebook/</link><description>拆解被包裝過的東西、數位自主權實踐、非典型理財觀</description><language>zh-TW</language><lastBuildDate>Mon, 06 Apr 2026 02:06:10 +0800</lastBuildDate><atom:link href="https://blog.stanwu.org/tags/facebook/feed.xml" rel="self" type="application/rss+xml"/><item><title>Hugo 靜態網站社群預覽完整踩坑紀錄：og:image、Cloudflare、Facebook 爬蟲 403</title><link>https://blog.stanwu.org/posts/social-media-preview-og-cloudflare-pitfalls/</link><pubDate>Sun, 05 Apr 2026 00:01:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/social-media-preview-og-cloudflare-pitfalls/</guid><description>&lt;p&gt;把文章分享到社群平台，結果跳出「No title」、「No description」，或是預覽圖莫名出現頭像——這篇文章完整記錄這些問題的根本原因，以及一個一個解掉的過程。&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;在完成 &lt;a href="https://blog.stanwu.org/posts/hugo-seo-aeo-complete-guide/"&gt;Hugo 靜態網站 SEO + AEO 最佳化&lt;/a&gt;之後，實際把文章貼到 Buffer 準備同步發佈到 Facebook、LinkedIn 和 X，結果馬上踩到一系列坑。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="問題一buffer-顯示no-titleno-description"&gt;問題一：Buffer 顯示「No title、No description」&lt;/h2&gt;
&lt;h3 id="症狀"&gt;症狀&lt;/h3&gt;
&lt;p&gt;在 Buffer 貼入文章 URL，預覽顯示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No title
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No description
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Buffer 錯誤訊息：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We were unable to generate a preview of this link. This may happen if the website blocks Buffer&amp;rsquo;s access to images and other content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="排查過程"&gt;排查過程&lt;/h3&gt;
&lt;p&gt;第一反應是 &lt;code&gt;og:title&lt;/code&gt; 和 &lt;code&gt;og:description&lt;/code&gt; 沒有輸出。用 curl 模擬 Facebook 爬蟲：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -A &lt;span class="s2"&gt;&amp;#34;facebookexternalhit/1.1&amp;#34;&lt;/span&gt; https://blog.example.com/posts/your-post/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTML 內容完全正確，og 標籤都在。問題不在程式碼。&lt;/p&gt;
&lt;p&gt;接著測試 &lt;code&gt;robots.txt&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://blog.example.com/robots.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;回傳的不是自己寫的內容，而是這個：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# As a condition of accessing this website, you agree to abide by the following&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# content signals:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# search: building a search index...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ai-input: inputting content into one or more AI models...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ai-train: training or fine-tuning AI models.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="根本原因"&gt;根本原因&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare 的 Managed robots.txt 功能開著&lt;/strong&gt;，它會攔截對 &lt;code&gt;/robots.txt&lt;/code&gt; 的請求，用 Cloudflare 自己的「Content Signals Framework」格式回應，完全取代你放在 &lt;code&gt;static/robots.txt&lt;/code&gt; 的檔案。&lt;/p&gt;
&lt;p&gt;Buffer 的爬蟲讀到這個格式不認識的 robots.txt，可能誤判為被封鎖，導致放棄抓取 metadata。&lt;/p&gt;
&lt;h3 id="解法"&gt;解法&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Scrape Shield → Managed robots.txt → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;關閉後 &lt;code&gt;robots.txt&lt;/code&gt; 恢復正常。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="問題二facebook-sharing-debugger-回傳-403"&gt;問題二：Facebook Sharing Debugger 回傳 403&lt;/h2&gt;
&lt;h3 id="症狀-1"&gt;症狀&lt;/h3&gt;
&lt;p&gt;到 Facebook Sharing Debugger (&lt;code&gt;developers.facebook.com/tools/debug/&lt;/code&gt;) 貼入 URL 重新抓取，結果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;回應碼：403
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;回應碼原因：This response code could be due to a robots.txt block.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please allowlist facebookexternalhit on your sites robots.txt config.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="排查過程-1"&gt;排查過程&lt;/h3&gt;
&lt;p&gt;明明 &lt;code&gt;robots.txt&lt;/code&gt; 已經是 &lt;code&gt;User-agent: * Allow: /&lt;/code&gt;，照理說 Facebook 爬蟲不應該被擋。&lt;/p&gt;
&lt;p&gt;用 curl 模擬確認：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -o /dev/null -w &lt;span class="s2"&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -A &lt;span class="s2"&gt;&amp;#34;facebookexternalhit/1.1&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://blog.example.com/posts/your-post/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 回傳：200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本機模擬是 200，但 Facebook 真實爬蟲拿到 403。&lt;/p&gt;
&lt;h3 id="根本原因-1"&gt;根本原因&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare 的 Bot Fight Mode&lt;/strong&gt; 把 Facebook 真實爬蟲的 IP 當成惡意 bot，在網路層直接封鎖，請求根本到不了 origin server，更不會去看 robots.txt。&lt;/p&gt;
&lt;p&gt;這就是為什麼：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本機用相同 User-Agent curl 是 200（本機 IP 沒被 Cloudflare 標記）&lt;/li&gt;
&lt;li&gt;Facebook 真實爬蟲是 403（Facebook 的 IP 被 Bot Fight Mode 封鎖）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="解法選一"&gt;解法（選一）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;方案 A：直接關閉 Bot Fight Mode&lt;/strong&gt;（適合靜態網站，攻擊面小）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Security → Bots → Bot Fight Mode → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;靜態 HTML 網站基本上沒什麼可攻擊的（無資料庫、無後端程式、無登入），Bot Fight Mode 帶來的保護效益有限，關掉換取社群爬蟲正常運作是合理的取捨。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案 B：建立 WAF Custom Rule 精準放行&lt;/strong&gt;（保留 Bot Fight Mode）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Security → WAF → Custom Rules → Create rule
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在「Edit expression」模式貼入以下表達式，Action 選 &lt;strong&gt;Skip → Skip all remaining custom rules&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;facebookexternalhit&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;Twitterbot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;LinkedInBot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;Bufferbot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;PerplexityBot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;GPTBot&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(http.user_agent contains &amp;#34;ClaudeBot&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="問題三沒有設定-ogimage頭像卻自動出現在預覽圖"&gt;問題三：沒有設定 og:image，頭像卻自動出現在預覽圖&lt;/h2&gt;
&lt;h3 id="症狀-2"&gt;症狀&lt;/h3&gt;
&lt;p&gt;文章 front matter 沒有設定 &lt;code&gt;image&lt;/code&gt;，程式碼也沒有輸出 &lt;code&gt;og:image&lt;/code&gt; meta tag，但 Facebook、Buffer 的預覽圖卻顯示網站頭像。&lt;/p&gt;
&lt;p&gt;確認 meta tag 確實不存在：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://blog.example.com/posts/your-post/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;property=&amp;#34;og:image&amp;#34;\|property=og:image&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 沒有輸出 → meta tag 確實不存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="根本原因-2"&gt;根本原因&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Facebook 有 fallback 機制&lt;/strong&gt;：當頁面沒有 &lt;code&gt;og:image&lt;/code&gt; meta tag 時，Facebook 爬蟲會自動掃描頁面裡所有的 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 標籤，抓第一張圖作為預覽圖。&lt;/p&gt;
&lt;p&gt;確認頁面裡的 img 標籤：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://blog.example.com/posts/your-post/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;img[^&amp;gt;]*src=[^[:space:]&amp;gt;]*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 輸出：img src=https://blog.stanwu.org/images/avatar.jpg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sidebar 的作者頭像用 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 標籤載入，Facebook 掃到了就拿去用。&lt;/p&gt;
&lt;h3 id="解法-1"&gt;解法&lt;/h3&gt;
&lt;p&gt;把 sidebar 頭像從 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 改成 CSS &lt;code&gt;background-image&lt;/code&gt;。Facebook 爬蟲只掃 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 標籤，不解析 CSS，所以改用 CSS 載入之後，Facebook 就掃不到這張圖。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layout 改動（&lt;code&gt;layouts/partials/header.html&lt;/code&gt;）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 改前 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/images/avatar.jpg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;作者名稱&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sidebar-avatar&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 改後 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sidebar-avatar&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;img&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;aria-label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;作者名稱&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CSS 改動（&lt;code&gt;assets/css/main.css&lt;/code&gt;）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 改前 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sidebar-avatar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 改後 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sidebar-avatar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/images/avatar.jpg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;視覺上完全一樣，但 Facebook 爬蟲看不到頭像了。&lt;/p&gt;
&lt;p&gt;改完後驗證：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://blog.example.com/posts/your-post/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;img[^&amp;gt;]*src=[^[:space:]&amp;gt;]*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 沒有輸出 → 頁面裡已無任何 &amp;lt;img&amp;gt; 標籤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="問題四ogdescription-有設但預覽沒有文字"&gt;問題四：og:description 有設但預覽沒有文字&lt;/h2&gt;
&lt;h3 id="症狀-3"&gt;症狀&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;og:description&lt;/code&gt; 在 HTML 裡確認存在，但 Buffer 或 Facebook 預覽只有大標題，沒有描述文字。&lt;/p&gt;
&lt;h3 id="根本原因-3"&gt;根本原因&lt;/h3&gt;
&lt;p&gt;兩個可能：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 描述 fallback 到站點描述而非文章摘要&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hugo 模板常見寫法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 錯誤：沒有 description front matter 時 fallback 到站點描述 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;og:description&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ with .Params.description }}{{ . }}{{ else }}{{ site.Params.description }}{{ end }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每篇文章分享出去都顯示一樣的站點 tagline，社群平台判定為重複內容可能降低展示優先度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 快取問題&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Facebook 快取了舊版 metadata，即使 HTML 已經更新，Facebook 仍顯示舊內容。&lt;/p&gt;
&lt;h3 id="解法-2"&gt;解法&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;修正 description fallback 邏輯&lt;/strong&gt;，改成用文章摘要（&lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt; 之前的內容）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $desc := site.Params.description }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if .IsPage }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ if .Params.description }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $desc = .Params.description }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ else }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $desc = .Summary | plainify | truncate 160 }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $desc }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;og:description&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $desc }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;twitter:description&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $desc }}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;優先順序：&lt;code&gt;front matter description&lt;/code&gt; → &lt;code&gt;文章摘要前 160 字&lt;/code&gt; → &lt;code&gt;站點描述（首頁用）&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清除快取&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Dashboard → Caching → Cache Purge → Custom Purge → 貼入 URL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;清完後到 Facebook Sharing Debugger 再點一次「再次抓取」。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="整體流程回顧"&gt;整體流程回顧&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;分享連結到 Buffer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No title / No description
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 排查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Managed robots.txt 攔截 → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Facebook Sharing Debugger 重抓 → 403
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 排查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloudflare Bot Fight Mode 封鎖 Facebook 爬蟲 IP → 關閉
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;頭像出現在預覽圖（無 og:image 時 Facebook 掃 &amp;lt;img&amp;gt;）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 排查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sidebar &amp;lt;img&amp;gt; 被掃到 → 改成 CSS background-image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ 預覽正常：標題 + 文章摘要，無多餘圖片
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="小結"&gt;小結&lt;/h2&gt;
&lt;p&gt;這次碰到的四個問題，表面上看起來像是「og 設定沒設好」，實際上大部分根因都在 &lt;strong&gt;Cloudflare 的預設行為&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;問題&lt;/th&gt;
&lt;th&gt;根因&lt;/th&gt;
&lt;th&gt;一行解法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No title / No description&lt;/td&gt;
&lt;td&gt;Cloudflare Managed robots.txt&lt;/td&gt;
&lt;td&gt;關閉 Managed robots.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facebook 爬蟲 403&lt;/td&gt;
&lt;td&gt;Cloudflare Bot Fight Mode&lt;/td&gt;
&lt;td&gt;關閉或 WAF 放行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;頭像出現在預覽&lt;/td&gt;
&lt;td&gt;Facebook 掃 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; fallback&lt;/td&gt;
&lt;td&gt;改 CSS background-image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description 顯示站點描述&lt;/td&gt;
&lt;td&gt;Hugo fallback 邏輯錯誤&lt;/td&gt;
&lt;td&gt;Summary 優先於 site.Params.description&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;對靜態網站來說，Cloudflare 帶來的保護主要是 CDN 加速和 L3/L4 DDoS 防護，應用層的 Bot Fight Mode 和 Managed robots.txt 反而會干擾正常的社群爬蟲和 AI 引擎，根據需求調整比全部開啟要好。&lt;/p&gt;</description></item></channel></rss>