部落格上一篇文章已經是 2020 年 12 月 29 日的了。從發布到今天,我每天都嘗試在 Google 搜尋一下它,卻發現一直沒有被收錄。
暴露了自己是一個高強度自搜人的事實 XD
手動到 Google Search Console 頁面去查看了一下,顯示站點地圖上次更新還停留在 12 月 19 日... 由此引出了今天的問題:如何讓 Google 自動更新站點地圖。
探索過程#
首先需要找到 Google 更新站點地圖的方法,通過查閱文件可以得知:
使用「ping」功能請求我們抓取站點地圖。發送如下所示的 HTTP GET 請求:
http://www.google.com/ping?sitemap={complete_url_of_sitemap}
例如:
http://www.google.com/ping?sitemap=https://example.com/sitemap.xml
所以思路十分清晰,只需要在部落格部署完成後手動 GET 這個地址即可。
解決方法#
Github Actions#
對於使用 Github Action 來部署部落格的使用者,操作流程十分簡單,只需要在 yml 文件部署命令的後面填上一行 curl http://www.google.com/ping?sitemap=<your sitemap>
便可以解決。
Vercel#
因為 Github Pages 訪問速度較慢,我使用的是 Vercel ,而它並沒有提供一個類似於 After Deployment Command 的功能。這使我沒有辦法精確 Hook 它的部署過程。
於是,我去請教了 NEU LUG 群的群友,而群友也給出了一個簡單粗暴的解決方法:管它 Hook 不 Hook ,定時更新一次就完了!
本來我也確實打算這樣幹了,但考慮到我部落格的更新頻率,以及 Google 文件中寫出的:
請僅在新建或更新站點地圖時向 Google 發送站點地圖相關提醒。如果站點地圖無任何變更,請勿多次向我們提交或 ping 站點地圖。
為了避免搞出事情,我還是捨棄了這種方法。但這給了我一個思路,即:不需要盲目追求 Hook ,只要達到效果就可。
思考後,我想到了這樣的方法:
在更新部落格(倉庫 master 分支 Push )時,Vercel 構建和 Github actions 同時觸發。Github actions 檢測 commit message 的內容,如果包含「更新部落格」這四個字便觸發流程:
- 等待 3min(我部落格在 Vercel 的構建要 1min~2min ,為了增加容錯率寫成 3min )
- 發送 GET 請求通知 Google 更新站點地圖。
具體 yml 流程文件如下:
name: ping-google
on:
push:
branches:
- master
jobs:
ping-google:
if: "contains(github.event.head_commit.message, '更新部落格')"
runs-on: ubuntu-latest
steps:
- name: wait for build
run: sleep 3m
- name: ping google to update sitemap.xml
run: curl http://www.google.com/ping?sitemap=https://blog.allwens.work/sitemap.xml
經測試,工作良好。
這樣處理缺點也是存在的:Github actions 對免費使用者有著每月 3000 分鐘的使用限額。雖然我們使用 sleep 命令休眠三分鐘時什麼都沒幹,但這段時間仍然會被計入你的 Github actions 使用時間中。(不過反正這些時間也用不完,我部落格更新頻率又很低,代價是可以接受的 233)
參考資料#
-
Github Actions 檢測 commit message :