Skip to content

SEO 友善的網址結構:路徑、參數與無副檔名網址

SEO 友善的網址結構:路徑、參數與無副檔名網址

網址是使用者與搜尋引擎 共同的第一印象,也是 重複內容 最常見的來源。它的麻煩之處在於:上線之後很難改,改網址就要處理轉址,處理不好就掉流量。

所以網址結構值得在專案初期就決定好。

好網址的四個特徵

✗  https://example.com/p?c=12&id=8891&ref=nav&lang=zh
✓  https://example.com/shoes/running-shoes
特徵說明
可讀看網址就知道會連到什麼內容
簡短層級不超過三層,路徑不超過一行
穩定內容改標題不必改網址
一致全站遵循同一套規則

網址裡的關鍵字影響很小

網址中的字詞是搜尋引擎理解主題的線索之一,也會在搜尋結果中被標成粗體。但它的權重遠低於 標題 與內文。

真正的價值在 可讀性,使用者一看就知道會連到哪,比較願意點擊與分享。

連字號,不要底線

這兩個對搜尋引擎意義不同

寫法搜尋引擎怎麼看
running-shoes兩個詞:runningshoes
running_shoes一個字串:running_shoes

連字號被視為 字詞分隔,底線則被當成字元的一部分。新專案一律用連字號。

其他字元的處理:

字元建議
大寫字母一律小寫(伺服器可能區分大小寫)
空白換成連字號
連續連字號合併成一個
檔案副檔名拿掉(見 無副檔名網址與尾斜線

層級不要太深

✗  /category/subcategory/sub-subcategory/type/product-name
✓  /category/product-name

目錄結構不必反映網址結構

最常見的誤解是「網址層級要對應資料庫的分類階層」。實際上不必,商品可以直接掛在 /products/名稱,分類關係用 麵包屑 表達就好。

網址層級深的實際壞處:字串變長、容易超出搜尋結果的顯示寬度、分類改名時要處理轉址。

不過網址階層與麵包屑保持一致還是有價值的,它讓「這一頁在網站的哪個位置」這件事在三個地方(網址、麵包屑 HTML、結構化資料)說法相同。

中文網址的取捨

中文網址在瀏覽器上會顯示成可讀的中文,搜尋引擎也支援。但複製出來是這樣:

https://example.com/文章/網頁效能優化
↓ 實際傳輸的形式
https://example.com/%E6%96%87%E7%AB%A0/%E7%B6%B2%E9%A0%81%E6%95%88%E8%83%BD%E5%84%AA%E5%8C%96
中文網址英文或拼音
瀏覽器顯示可讀可讀
複製貼出一長串編碼正常
貼到不支援的環境可能損壞安全
分享到通訊軟體部分軟體會截斷安全
後端與日誌處理需注意編碼單純

內容型網站建議用英文

不是因為 SEO,而是因為 可攜性。編碼後的網址在貼到程式碼、寫進設定檔、出現在日誌裡時都很難處理。

這個文件站的做法就是全部用英文 slug:/seo/indexing-url-structure

無副檔名網址與尾斜線

拿掉副檔名

✗  /about.html
✓  /about

副檔名洩漏了實作技術(.php.aspx.html),而且換技術就要改網址。多數框架有現成的設定:

多數靜態網站產生器與框架都有對應的設定項,名稱不一(cleanUrlstrailingSlashtrailing_slash⋯),效果都是把 /about.html 對到 /about。純靜態主機沒有這個選項時, 在伺服器層改寫也可以:

nginx
# 對外只露出無副檔名的網址,內部才補回 .html
try_files $uri $uri.html $uri/ =404;

尾斜線只能有一種

加與不加是兩個不同的網址

對伺服器來說這是 兩個不同的網址。同時能開就產生 重複內容

https://example.com/about
https://example.com/about/

決定一種,然後把另一種 永久轉址 過來:

nginx
# 選擇「不加尾斜線」,把帶斜線的轉走
rewrite ^/(.*)/$ /$1 permanent;

決定之後,這四個地方都要照著寫:

位置要一致
canonical指向選定的版本
sitemap只列選定的版本
站內連結全部用選定的版本
轉址另一種永久轉到選定的版本

同一組要統一的還有:

項目選一種並轉址
通訊協定httpshttp 轉過來)
www 前綴有或沒有,選一種
大小寫全小寫

查詢參數

參數是爬取預算的最大殺手。三種排序方式,加上兩個各有五個選項的篩選條件,就是七十五種組合,每一個都是獨立網址。

參數類型處理方式
內容決定性?page=2?id=123保留,正常收錄
排序與篩選?sort=price?color=redcanonical 指向無參數版本
追蹤?utm_source=fb?fbclid=canonical 指向無參數版本
工作階段?sessionid=abc不該出現在網址裡

自我參照的 canonical 就能解決大半

/products?sort=price 這一頁輸出的 canonical 若指向 /products,那些排序變體就不會被當成獨立頁面。

爬取預算的問題則用 robots.txt 處理:

Disallow: /*?sort=
Disallow: /*?filter=

不要用 robots.txt 擋掉「內容決定性」的參數

擋掉 ?page= 會讓分頁列表的第 2 頁以後完全爬不到,那些商品就再也不會被發現。分頁的處理見 分頁與無限滾動的爬取

網址包含日期嗎

/blog/2024/01/15/post-title
/blog/post-title
含日期不含日期
內容時效性一目了然
舊文章看起來過時是(缺點)
更新內容後日期會誤導不影響
網址長度

常青內容不要放日期

技術文件、教學這類會持續更新的內容,放日期只會讓它看起來過時。新聞與活動公告才適合放日期。

發佈時間用 Article 結構化資料 的欄位表達就好,不必寫在網址裡。

檢查清單

項目標準
全站統一 https必備
www 與非 www 統一並轉址必備
尾斜線統一並轉址必備
網址全小寫必備
用連字號而非底線建議
沒有副檔名建議
層級不超過三層建議
追蹤與排序參數有 canonical 處理必備
網址階層與麵包屑一致建議
常青內容的網址不含日期建議

常見問題

網址裡放關鍵字有幫助嗎?

有,但影響很小。網址中的字詞是搜尋引擎理解頁面主題的線索之一,也會在搜尋結果中被標成粗體。真正的價值在於可讀性:使用者一看網址就知道會連到哪裡,比較願意點擊與分享。

連字號和底線有差嗎?

有。搜尋引擎把連字號視為字詞分隔,底線則被當成字元的一部分。所以用連字號寫的網址會被拆成獨立的詞,用底線寫的會被當成一個長字串。新專案一律用連字號。

中文網址可以用嗎?

可以,搜尋引擎支援,瀏覽器也會顯示成可讀的中文。但複製出來時會變成一長串百分號編碼,貼到不支援的環境會很難看,也容易在傳遞過程中損壞。內容型網站建議改用英文或拼音。

尾斜線要加還是不加?

兩種都可以,但全站必須一致,並把另一種永久轉址過來。加與不加對伺服器來說是兩個不同的網址,同時存在就會產生 重複內容 。決定哪一種之後,網站地圖、內部連結與正規網址都要照著寫。

查詢參數會造成問題嗎?

會。排序、篩選與追蹤參數的組合可能產生數以萬計的網址變體,每一個都被當成獨立頁面,大量浪費爬取預算。處理方式是自我參照的正規網址加上封鎖不必要的參數路徑。

延伸閱讀

參考資料:Google 搜尋中心:網址結構最佳做法