網站存在與SEO 是做什麼的?
目的
兩個商店在允許提交前都會要求提供URL:隱私政策、支援頁面、帳戶刪除,以及用於應用連結的 .well-known 檔案。此技能建立一個小型、快速的靜態網站,首先滿足這些表單要求,然後使其可被發現(搜尋引擎、連結預覽、AI助手),無需追蹤器、暗黑模式或應用無法支持的數字。
請在商店列表和隱私表單(listing-and-aso, privacy-and-declarations)之前執行此操作:它們需要可用的URL。
先決條件
- 您控制的一個網域,具有DNS存取權限(範例中使用Cloudflare;任何能設定標頭並提供檔案而無重定向的主機均可)。
- 來自
identity-and-signing的應用最終識別碼和簽署資料(Team ID、Bundle ID、Package Name、Play app signing SHA-256)。 - 來自程式碼/SDK掃描的隱私政策文本(
privacy-and-declarations)和應用中實際存在的刪除流程。 - 從商店讀回的價格(
subscriptions-and-payments),切勿憑記憶輸入。 - Node.js 18+ 用於 scripts/ 中的腳本。
1. 商店要求的頁面
包含每個商店欄位 → URL的檢查清單:references/store-url-checklist.md
| 頁面 | 路徑(建議) | 規則 |
|---|---|---|
| 隱私政策 | /privacy | 公開,無需登入,無地理封鎖,HTML(非PDF),包含應用名稱,與商店隱私回答一致 |
| 條款 | /terms | 如果您銷售訂閱(Apple的標準EULA或您自己的;在應用和列表中連結它)則需要 |
| 支援 / 聯絡 | /support | 真實的聯絡方式(電子郵件或表單),不僅僅是常見問題 |
| 帳戶刪除(網頁) | /delete-account | Google Play 需要此URL。包含列表中應用名稱,讓用戶從頁面請求刪除,說明什麼被刪除、什麼被保留以及保留多久,並說明商店訂閱必須單獨取消 |
- Apple 要求刪除必須在應用內開始(準則 5.1.1(v));網頁不能取代此要求。Play 要求應用內路徑和網頁URL兩者。文件:Apple 帳戶刪除, Play 帳戶刪除, Play 隱私政策URL規則。
- 已登出且穩定。 無Cookie牆、無需登入、無需JavaScript即可閱讀文本。提交後請勿重新命名路徑;如果必須,請保留舊路徑的301重定向。
- 每種語言。 每種語言一個URL(
/privacy,/de/privacy)搭配hreflang;App Store Connect 讓您為每個在地化設定隱私URL。如果某頁面未翻譯,則連結預設語言頁面,而非404。 - 在法律頁面上顯示「最後更新」日期,並在版本控制中保留舊版本。
2. 應用連結託管
檔案本身的模板位於 identity-and-signing/templates/。此部分關於如何提供它們。
https://<domain>/.well-known/apple-app-site-association和/.well-known/assetlinks.json:HTTP 200,Content-Type: application/json,無重定向(不是 http→https,不是 apex→www,不是尾斜線),無身份驗證,無機器人驗證頁面。- 決定 apex 還是
www,保持一致。在權利/意圖過濾器中列出的每個主機上提供檔案;僅對頁面重定向其他主機,絕不對/.well-known/重定向。 - 靜態主機通常將無副檔名的AASA提供為
application/octet-stream。透過Worker路由/.well-known/*(請參閱模板)或明確設定標頭,然後使用scripts/check-site.mjs進行檢查。 - 在聲明網域的應用建置之前部署
.well-known檔案。Apple透過其CDN取得AASA,因此變更可能需要一些時間才能生效。
邀請 / 推薦頁面 (/i/<code>)
- Worker 根據後端發出的確切字母表和長度驗證代碼,然後填充模板。URL中的其他任何內容都不會到達HTML。
- 如果應用已安裝,通用連結 / 應用連結將直接開啟它(路徑必須在AASA
components和 Android 意圖過濾器中)。如果未安裝,頁面會顯示兩個商店按鈕和一個「複製代碼」按鈕作為手動備用方案。 - Android:將代碼附加到 Play URL 作為
&referrer=<url-encoded key=value>,並在應用中使用 Play Install Referrer API 讀取。iOS 沒有安裝推薦來源;請用戶粘貼代碼,或僅在明確點擊後從剪貼簿預先填入。 - 標頭:
X-Robots-Tag: noindex,Cache-Control: private, no-store,Referrer-Policy: no-referrer。將/i/排除在網站地圖之外。不要禁止它在 robots.txt 中:無法取得頁面的爬蟲永遠看不到noindex。
3. 登陸頁面
- 與商店截圖相同的視覺語言(顏色、字體、相同的真實UI卡片)。從網站到達的訪客應該能認出商店頁面。
- 商店徽章僅使用官方素材,未經修改,具有所需的間距和措辭;直接連結到列表。規則:Apple 行銷指南, Google Play 徽章。
- 發佈前:一行「即將在 App Store 和 Google Play 上架」,而不是三個停用的徽章。發佈時(發佈上線後):交換為真實徽章連結,添加 Smart App Banner meta(文件),更新
llms.txt和 JSON-LD。保持這在單一配置標誌中以便一次性更改。切換前需要批准。 - 誠實的價格。 價格來自從商店回讀生成的單一檔案。頁面包含佔位符(
%%PRICE_MONTHLY%%);Worker 根據訪客的國家(request.cf.country)填充它們,並對表格以外的國家顯示「商店將以您的貨幣顯示確切價格」。頁面語言永遠不決定貨幣。無劃掉的「原價」、無偽造倒計時、無任何預先勾選的選項。 - 快速且可存取。 文本在HTML中(非JS渲染)、一個CSS檔案、很少或無JS、自託管字體搭配
font-display: swap、主圖調整大小並設定fetchpriority="high"。目標:LCP < 2.5 秒,CLS < 0.1,INP < 200 毫秒(Web Vitals)。對比度和焦點狀態遵循 WCAG 2.2;尊重prefers-reduced-motion。 - 分析。 建議無或伺服器端/無Cookie計數(邊緣日誌、無標識符的隱私友好分析)。如果您不設定Cookie且不載入第三方腳本,則無需Cookie橫幅;請不要「以防萬一」顯示一個。如果您添加任何追蹤器,同意橫幅、隱私政策和商店隱私回答必須一起更改。
4. 社交分享圖片
- 每種語言一張Open Graph圖片:1200×630 PNG/JPG,小於約1 MB,文字大得足以在縮圖大小下閱讀。
og:image和twitter:image中的絕對https://URL,加上og:image:width/height/alt,og:title,og:description,og:url,twitter:card=summary_large_image。規範:ogp.me,Meta 分享指南。 - 訊息應用程式會積極快取預覽。更改圖片後,請為其指定一個新檔案名稱(或
?v=2),然後在 Sharing Debugger 中重新擷取(「再次擷取」)。WhatsApp 和其他即時通訊應用會保留自己的快取,沒有公開的重新整理工具,因此新的圖片URL是可靠的解決方案;透過在新聊天中發送連結進行測試。
5. 技術SEO
- 標題(約50–60個字元,品牌名稱 + 功能)和 meta 描述(約150–160個字元)每個頁面和語言獨一無二。標題連結,摘要。
- hreflang:每個語言版本列出所有版本包括自身,加上
x-default;配對必須是互相的。在地化版本。 - Canonical:自我參照、絕對、且在最終(無重定向)URL上。正規化。
- 網站地圖 僅包含 200、可索引、正規的 URL 和真正的
<lastmod>(內容更改的日期,例如來自 git,而不是建置時間)。模板,文件。 - robots.txt:模板,介紹。robots.txt 控制爬蟲,而非索引;對必須排除在結果之外的頁面使用
noindex。 - 結構化資料(JSON-LD):Organization,WebSite,MobileApplication;FAQPage 僅用於頁面上可見的常見問題。範例和規則:references/structured-data.md。
- 非生產環境主機(預覽、
*.workers.dev)發送X-Robots-Tag: noindex。
6. 發現
- Google Search Console:添加一個 Domain 屬性,在 apex 添加
google-site-verificationTXT 記錄,驗證,提交網站地圖,請求首頁索引。驗證所有權。 - Bing Webmaster Tools:從 Search Console 匯入,或使用 Bing 提供的 DNS 記錄(CNAME)驗證,然後提交網站地圖。添加和驗證。
- IndexNow(Bing、Yandex、Seznam、Naver 等;不包括 Google):主機
<key>.txt包含金鑰,部署,然後執行node scripts/indexnow-ping.mjs(試執行)和--send。腳本首先檢查金鑰檔案是否已上線。協定。 - AI 爬蟲和 llms.txt:根據每個機器人決定是否允許搜尋/回答機器人和訓練機器人(擁有者的決定,需要批准)。機器人列表、用途和官方連結:references/ai-crawlers.md。添加一個簡短的 llms.txt,包含產品摘要和關鍵URL,不包含價格。
DNS 記錄是共享基礎設施:添加新記錄;切勿編輯或刪除現有的 TXT/SPF/MX 記錄。任何 DNS 更改前需要批准。
7. 部署(Cloudflare Worker 範例)
模板:templates/worker.example.js。它以正確的類型提供 .well-known 檔案且無重定向,填充按國家/地區的價格佔位符,渲染 /i/<code>,添加安全標頭並在非生產主機上添加 noindex。
兩種儲存選項:
- Workers Static Assets(最簡單):在
wrangler.jsonc中設定"assets": { "directory": "./dist", "binding": "ASSETS", "run_worker_first": true };Worker 呼叫env.ASSETS.fetch()。文件。 - KV(內容定址):建置將檔案寫入其雜湊下以及
manifest.js(路徑 → 雜湊,類型);使用wrangler kv bulk put在部署 Worker 之前上傳,以便新的清單永遠不會指向缺少的檔案。KV 命令。
步驟:
node build.mjs→dist/(如果缺少任何翻譯鍵或未填充的佔位符(價格佔位符除外),則失敗)。- 單元測試(
node --test):對子資源執行 Worker 的fetch。涵蓋:AASA/assetlinks 200 +application/json+ 無重定向;www/http僅對頁面重定向;/i/<bad>→ 404,/i/<good>→ noindex + no-store;每個價格區域填充每個佔位符(無剩餘%%);格式錯誤的百分比編碼 → 404,而非 500。 - 預覽:
npx wrangler deploy --dry-run,或部署到預覽主機並執行node scripts/check-site.mjs https://<preview-host>。 - 批准 — 生產部署(
npx wrangler deploy)。在wrangler.jsonc中固定account_id、name和路由,以便命令無法針對共享帳戶上的另一個專案。 - 部署後:
node scripts/check-site.mjs https://example.com --invite <sample code>,然後是 IndexNow ping。
需要人類批准的決策點
- 生產部署和 DNS 更改。
- 法律頁面(隱私、條款、刪除)的措辭;擁有者需簽署任何更改。
- AI 訓練爬蟲允許/拒絕。
- 「即將推出」→「下載」切換以及網站上顯示的任何價格。
- 添加分析、等待列表表單或任何收集個人資料的內容。
驗證
node scripts/check-site.mjs https://example.com --paths /privacy,/terms,/support,/delete-account退出碼 0:所需頁面在登出狀態下返回 200,AASA/assetlinks JSON 無重定向,OG 標籤具有可達的絕對圖片,互相的 hreflang,網站地圖 URL 全部 200。- 商店URL檢查清單中的每個URL在手機的私密視窗中開啟。
- Rich Results Test 和 Schema Markup Validator 顯示無錯誤;PageSpeed Insights 行動 LCP < 2.5 秒。
- Search Console:網站地圖「成功」;Bing:IndexNow 提交可見。
常見陷阱
- 隱私URL重定向到登入頁面、PDF 或從不提及應用名稱的通用公司政策。
- 刪除頁面僅說「在應用中刪除」(Play 需要在頁面上有一個請求路徑)或忘記提及取消商店訂閱。
- AASA 透過 apex→www 重定向、作為
text/html或位於機器人驗證頁面後面提供。 - robots.txt 中的
Disallow: /i/與noindex標頭一起使用,而爬蟲隨後永遠看不到後者。 - 按語言硬編碼的價格(對於瑞士訪客的德語頁面顯示歐元)或在商店價格變更後成為過時數字。
- 為新應用捏造的
aggregateRating,或價格僅在一個國家成立的offers。 - OG 圖片
[出於翻譯目的而截斷]