
WordPress 的網址預設都是小寫,例如 /about-us/。但網址不一定都照你設定的被打出來:
- 印在名片、DM 上的網址,設計師排版時寫成
/About-Us/比較好看。 - 別的網站連結你時,打成了大寫。
- 從舊網站搬過來,舊網址本來就有大寫。
Google 搜尋中心的說明寫得很清楚:Google 處理網址時會區分大小寫,/APPLE 和 /apple 會被當成兩個不同的網址。同一頁內容有好幾個網址,搜尋的分數就被分散了。
這篇先實測 WordPress 遇到大寫網址會怎樣,再用一段程式碼讓所有大寫網址都 301 轉到小寫。
WordPress 本來會怎麼處理
在測試站(WordPress 7.1.3)建立一篇文章 /keelung-shop-website/、一個頁面 /about-us/、一個分類 /category/news/,沒有加任何程式碼,直接用大寫網址打開:
- 文章、頁面:
/Keelung-Shop-Website/、/About-Us/都正常打開,狀態碼 200,內容和小寫網址一樣。頁面裡的「標準網址」(canonical)標籤指向小寫的網址。 - 分類頁:
/category/News/一樣打得開,但頁面上沒有標準網址標籤;/Category/news/(前面的 category 大寫)直接變成找不到頁面。
也就是說,文章和頁面靠標準網址標籤告訴 Google 正確的網址,但分類頁沒有,有些寫法還會打不開。加一段轉址最乾淨。
程式碼
放在子佈景主題的 functions.php,或用 Code Snippets 這類外掛新增:
PHP
// 網址有大寫英文字母時,301 轉到全部小寫的網址(查詢字串 ? 後面的部分不動)
add_action( 'template_redirect', function () {
if ( ! in_array( $_SERVER['REQUEST_METHOD'] ?? 'GET', array( 'GET', 'HEAD' ), true ) ) {
return; // 表單送出(POST)不轉,避免資料不見
}
$uri = $_SERVER['REQUEST_URI'] ?? '/';
$path = (string) parse_url( $uri, PHP_URL_PATH );
$query = parse_url( $uri, PHP_URL_QUERY );
// 中文網址會被編碼成 %E5%9F%BA 這種格式,裡面的大寫是編碼,不算
$letters = preg_replace( '/%[0-9A-Fa-f]{2}/', '', $path );
if ( ! preg_match( '/[A-Z]/', $letters ) ) {
return;
}
$target = strtolower( $path ) . ( $query ? '?' . $query : '' );
wp_safe_redirect( $target, 301 );
exit;
}, 1 ); // 比 WordPress 自己的轉址(優先順序 10)早執行逐段說明:
template_redirect:WordPress 準備顯示前台頁面之前會執行這個 hook。後台、登入頁、REST API 都不會經過這裡,不會被影響。- 只轉 GET、HEAD:表單用 POST 送出時,如果轉址,送出的資料會不見,所以跳過。
- 查詢字串不轉:
?後面的部分原樣保留。廣告追蹤碼的值常常有大小寫,例如utm_campaign=Autumn_Sale,轉成小寫會讓報表對不起來。 - 中文網址不受影響:中文網址在網址列裡會變成
%E5%9F%BA這種編碼,裡面的大寫字母不是真的大寫,程式碼先把它們拿掉再判斷。 - 用 301:告訴搜尋引擎這是永久的搬家,舊網址的分數會轉到新網址。
- 優先順序 1:比 WordPress 內建的轉址更早執行,避免兩次轉址。
實際測試的結果
同一個測試站,加上程式碼之後:
/keelung-shop-website/:維持 200,不轉址。/Keelung-Shop-Website/、/KEELUNG-SHOP-WEBSITE/:301 轉到/keelung-shop-website/,打開是 200。/Keelung-Shop-Website/?utm_source=FB&utm_campaign=Autumn_Sale:301 轉到/keelung-shop-website/?utm_source=FB&utm_campaign=Autumn_Sale,查詢字串的大小寫沒變。/About-Us/:301 轉到/about-us/。/category/News/、/Category/news/:都 301 轉到/category/news/,原本打不開的那個也能看了。- 中文網址:小寫編碼和大寫編碼的版本都直接打開,沒有轉址。
/No-Such-Page/:301 轉到/no-such-page/,還是找不到頁面(本來就不存在)。- 用 POST 送出到
/Keelung-Shop-Website/:沒有轉址,照常處理。 - 上傳一張檔名有大寫的圖片
Logo-ABC.png,用原本的網址打開:200,正常顯示。圖片這類實際存在的檔案,由主機直接回應,不會經過 WordPress,所以不受影響。
要注意的地方
- 已經存在的檔案不會被轉:圖片、PDF 的檔名有大寫,網址也要照原本的大小寫打,主機上的檔名在 Linux 主機是分大小寫的。新上傳的檔案最好一開始就用小寫的檔名。
- 網站有其他程式用大寫網址:例如某個外掛的頁面網址固定有大寫,加上程式碼後要點點看還能不能用。
- 加了快取外掛的網站:轉址是 WordPress 執行的,被快取起來的頁面可能不會經過這段程式。加完之後清一次快取再測。
統一網址的同一個道理,還有「有沒有 www」「http 還是 https」,做法在〈WordPress 網址統一成有 www 或沒有 www〉;用主機設定轉址的方法在〈.htaccess 用法大全〉。
延伸閱讀
- WordPress 網址統一成有 www 或沒有 www:一般設定與 301 轉址完整做法
- .htaccess 用法大全:轉址、HTTPS、安全防護、壓縮與快取常用設定(WordPress 適用)
- 網站搬家、換主機要注意什麼?網址、DNS、Email 和舊網址轉址
網址統一了,搜尋的分數才不會被分散。正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站管家年費包含每年 12 次小修改,像這樣的小調整都可以交給我們,台北與全台客戶也歡迎免費諮詢。






發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。