sitemap.xml 是搜尋引擎用來探索你希望被索引的頁面所讀取的標準 XML 檔案,你可以把一份經過檢視的絕對頁面 URL 清單貼進XML Sitemap Generator,選擇任何要共用的選填中繼資料,然後下載產生出來的 UTF-8 檔案,來取得這樣一份檔案。這個檔案是一份純粹的 <urlset> 文件,使用官方的 http://www.sitemaps.org/schemas/sitemap/0.9 命名空間,並為每一個不同的頁面包含一筆 <url> 項目。每一筆 <url> 項目都含有一個 <loc>,內容是某一頁的絕對網址,也可能包含 <lastmod>、<changefreq> 與 <priority> 標籤。Sitemap 協定要求文件本身必須以 UTF-8 編碼,而且每個位置都必須是少於 2,048 個字元的絕對 URL,而這個產生器會替你強制執行這兩項規則。

這個產生器不會爬取你的網站。它是一個「清單轉 XML」的工具:你提供一份 URL 清單,它就回傳一份完成的 sitemap.xml。從分行、URL 正規化,到去除重複、XML 跳脫、位元組測量,以及最終下載,每一個步驟都在目前的瀏覽器分頁中執行。沒有任何內容會被上傳,所以你的 URL 清單與產生的 XML 絕不會離開你的機器。這樣的設計,適合你已經知道哪些頁面該放進 sitemap 的情況,因為這份檔案的準確度,完全取決於你交給它的 URL 準確與否。

how to get sitemap xml of a website
how to get sitemap xml of a website

這個產生器會產生什麼——以及它刻意省略了什麼

這個工具每行接受一個 URL,會驗證每一行,透過瀏覽器的WHATWG URL parser將接受的 URL 正規化,在保留最先出現順序的同時移除重複項目,跳脫對 sitemap 位置而言重要的五個 XML 實體,並產生一份帶有單一下載連結的 UTF-8 sitemap.xml。編輯 URL 清單或任何選項,都會立即撤銷先前的下載並清除既有的 XML,因此過期的輸出絕不會流入已儲存的檔案中。

這個工具不會做的事同樣重要。它不會造訪頁面、追蹤連結、檢查 canonical 標籤、讀取修改日期、發現重新導向、驗證 HTTP 狀態碼,或判斷頁面是否可被索引。它不會把結果提交給搜尋引擎,也不會建立 sitemap 索引檔、圖片、影片或新聞擴充功能、hreflang 標記、gzip 檔案,或 robots.txt 規則。如果你需要以上任何一項,你要找的是另一個工具或另一套流程。

產生器強制執行的 URL 清單規則

編輯器中每一個非空白的行,都必須是指向這份輸出檔案所代表主機的絕對 HTTP 或 HTTPS URL。像 example.com 這樣的裸網域、像 /about 這樣的相對路徑、FTP 位址、原始空白字元、控制字元、格式錯誤的百分比跳脫、內嵌的憑證,以及片段(fragment),全部都會在出錯的那一行被拒絕,而不會被默默修剪或略過。只有空白字元的行會被忽略,讓你可以用空白行來做視覺分組。非空白行前後多餘的空白字元會被視為錯誤,所以貼上內容結尾多出來的一個空格,會讓整次產生失敗。

一份產生出來的檔案,只能對應到單一序列化後的主機,包括任何非預設連接埠。這遵循了 Sitemap 協定的單一主機規則,也正是為什麼同一個主機的 HTTP 與 HTTPS URL 可以合法出現在同一份檔案中,而 example.com 與 example.com:8443 混用則不行的原因。憑證會被拒絕,因為使用者名稱或密碼不應該出現在公開的 sitemap 中;片段也會被拒絕,因為擷取頁面的 HTTP 請求並不會攜帶片段,所以兩個 #section 變體實際上仍然是同一個被擷取的資源。

你可以套用的選填中繼資料

這個產生器把 lastmod、changefreq 與 priority 視為選填欄位。如果你把它們留空,對應的標籤就會從每一筆項目中省略,輸出的就是一份只有 loc 的 XML 檔案。如果你填入其中一個,同樣的值會套用到檔案中的每一個 URL,因此這些欄位只有在整份清單套用同一個共用值都屬實的情況下才有意義。

欄位接受的格式備註
lastmodYYYY-MM-DD,或帶有秒數與 Z 或 UTC 偏移量的完整日期時間真實的西曆日期;會檢查曆法、閏年與時區的限制。前後多餘的空白字元會被拒絕。
changefreq以下其中之一:always、hourly、daily、weekly、monthly、yearly、never協定提示,並非爬取指令。
priority0.0 到 1.0 之間的小數協定提示,並非排名保證。

只有在檔案中每一個頁面的最後重大修改時間確實都相同時,才使用 lastmod。這個工具不支援逐一 URL 分別設定日期,因此當日期不同時,正確的做法是把清單拆成幾份較小的檔案,或是在產生之後再另外加上中繼資料。無效的選填中繼資料會導致整次產生失敗;它不會被默默捨棄,格式錯誤的值也絕不會產生一份部分正確的檔案。

如何從一份經過檢視的 URL 清單取得 sitemap.xml

  1. 整理你的 URL 清單。從你的 CMS 匯出檔、分析報表、現有的 sitemap,或人工檢視中,找出你真正想被索引的頁面網址,並在貼上之前先解決相對路徑、重新導向與重複項目的問題。
  2. 在編輯器中每行貼上一個絕對 URL。整份檔案使用單一主機,包括任何非預設連接埠。可用空白行做視覺分組;只有空白字元的行會被忽略。
  3. 決定是否要加入選填的中繼資料。若要只產生含 loc 的檔案,把選填欄位留空即可;或者填入一個對每一筆項目都屬實的共用 lastmod、changefreq 或 priority。
  4. 產生 XML。這個工具會依 LF、CRLF 或 CR 換行分割、驗證每一行、正規化接受的 URL、依最先出現的順序去除重複項目、跳脫 XML 實體,並測量最終的 UTF-8 位元組數。
  5. 檢視完成的 XML 與統計摘要。確認行數、重複項目數與位元組大小,並逐一檢視 <loc> 的值,確認它們就是你想要的 URL。
  6. 從暫時的下載連結下載 sitemap.xml。這個連結屬於目前的結果;編輯任何欄位都會撤銷它,再次產生也會在建立新連結之前先撤銷舊的連結。

工具限制與協定上限的比較

Sitemap 協定允許每份檔案最多 50,000 個 URL,以及最多 52,428,800 個未壓縮位元組,而這個產生器刻意設定得更低,因為整條處理流程都是在單一瀏覽器分頁中執行的。每一項限制都是全有或全無的:第 10,000 個不重複的 URL 會被接受,再下一個就會失敗;恰好 10,485,760 位元組的邊界會被接受,多一個位元組就會被拒絕;重複的行則不會佔用輸出的名額。

上限協定上限產生器限制在邊界的行為
每份檔案的不重複 URL 數50,00010,000第 10,000 個會被接受,下一個不重複的 URL 就會失敗。
檔案大小(未壓縮)52,428,800 位元組10,485,760 位元組(10 MiB)恰好在邊界會被接受,多一個位元組就會被拒絕。
單一序列化位置的長度少於 2,048 個字元最多 2,047 個字元過長的 URL 會在 XML 建立之前就失敗。
輸入文字大小未規範5,000,000 個 UTF-16 code unit限制剖析與預覽所使用的記憶體。

這些較低的上限限制了剖析、預覽、Blob 與瀏覽器記憶體的使用量,並沒有假裝自己就是協定的上限。這裡沒有默默截斷、沒有縮短版的 XML、沒有省略號,也沒有部分下載。一旦觸及限制,檔案就會直接無法產生,這時你該做的,是拆分清單或移除部分項目。

發布前該檢查什麼

這個產生器回傳的 XML,準確度完全取決於你提供的 URL 與中繼資料,因此檢視這一步是屬於你的責任。逐一檢查最終清單,找出你忘記正規化的重新導向、應該合併的近似重複頁面、不該被索引的封鎖頁面、像是測試環境或內部搜尋結果這類私有頁面,以及任何因為你把來源清單修剪得太過激進而遺漏的重要頁面。如果你加上了一個共用的 lastmod,請確認這個日期對檔案中每一個頁面而言,真的都是最新的重大修改時間,因為搜尋引擎會把灌水的 lastmod 視為內容過時建議的訊號。

在發布之前,先決定這份檔案要放在哪裡。Sitemap 協定要求 sitemap 必須託管在它所代表的主機上,因此你為 example.com 產生的 sitemap.xml,就必須從 example.com 提供服務。這個產生器無法驗證這一點,也無法驗證跨網站提交的權限,所以一份代表某個主機的檔案,不能託管在另一個主機上,否則會違反協定。發布之後,請在搜尋引擎偏好的管道中自行提交這份檔案的 URL,而不要期待這個產生器會替你完成這一步。

這份檔案在底層是如何組成的

這項實作方式刻意設計得很窄。輸入內容會依 LF、CRLF 或 CR 分割,只有只含空白字元的行會被忽略。每一個非空白行都會被檢查是否為絕對格式、允許的通訊協定、內嵌憑證、片段、原始控制字元、格式錯誤的百分比跳脫,以及多餘的前後空白字元。被接受的行會經過瀏覽器的 URL 剖析器處理,該剖析器會把主機轉成小寫、移除預設連接埠、在需要時加上根斜線,並在保留既有合法百分比跳脫的同時,對非 ASCII 的部分進行百分比編碼。序列化後的 href 會依最先出現的順序去除重複,重複項目的數量則會顯示在結果摘要中。

XML 輸出以一個 UTF-8 宣告開頭,接著是使用官方 sitemaps.org 命名空間的 <urlset> 元素。每一筆項目都包含一個 <url> 與一個 <loc>,其文字內容會在 URL 正規化之後進行 XML 跳脫。& 符號、單引號、雙引號、大於號與小於號會被轉換成 XML 實體,其中 & 符號會最先被替換,以避免產生出來的實體被跳脫兩次。最終的檔案會用 UTF-8 TextEncoder 測量,恰好 10,485,760 位元組的邊界會被接受,多一個位元組就會被拒絕,產生出來的 Blob 則透過一個暫時的 Object URL 提供,在你編輯任何輸入內容或再次產生時,這個 URL 就會被撤銷。

若想更深入了解如何找出要放進清單中的 URL,sitemap URL discovery guide說明了在貼上之前,你可以在自己的瀏覽器中查看哪些地方。Google 的sitemap build and submit guide則是搜尋引擎在檔案上線後對其有何期待的權威參考資料。

如果你正在權衡選項,How to Get a Website Sitemap XML as Plain Text一文對此有詳細說明。