今天要來聊聊 .htaccess,那個讓人又愛又恨的小檔案
今天要來聊聊 .htaccess 這個東西。老實說,很多剛接觸網站管理、或是自己用 WordPress 架站的朋友,一聽到要手動改這個檔案就頭痛。它看起來就是一堆神秘的程式碼,而且聽說只要改錯一個字,整個網站就會掛掉給你看,顯示一個大大的「500 Internal Server Error」。 聽起來超可怕的對吧?
但反過來說,.htaccess 其實是個超級強大的工具。它就像是你網站的隱形保全兼交通警察,可以幫你擋掉惡意攻擊、保護重要檔案,還能指揮網站的網址,讓 SEO 的權重不要跑掉。所以,我自己是覺得,就算現在很多主機後台都有圖形化介面,學會自己看懂跟修改 .htaccess 還是非常重要的技能。
一句話結論
簡單講,學會 .htaccess 的基本設定,你可以用最少的成本,大幅提升網站的安全性和 SEO 基礎體質。雖然它有風險,但只要小心操作,回報絕對是值得的。
我踩過的坑:一個真實案例
我還記得幾年前幫一個客戶處理網站,他的網站常常被一些奇怪的 IP 攻擊,而且 Google Search Console 裡面出現一大堆重複內容的警告。檢查之後才發現,他的 .htaccess 幾乎是空白的,只用了 WordPress 預設的那幾行。
問題出在哪?第一,他完全沒有阻擋惡意 IP 的機制。第二,他的網址沒有做標準化,也就是說 `http://www.domain.com`、`http://domain.com` 跟 `https://www.domain.com` 在 Google 眼裡是三個不同的頁面,導致權重分散。 這對 SEO 來說根本是災難。後來我花了點時間,幫他把 .htaccess 重新設定好,加上了安全規則和 301 轉址,過了一兩個月,網站的安全性問題跟 SEO 重複內容的狀況才慢慢改善。
怎麼做?.htaccess 的安全與 SEO 設定重點
好,那我們就直接進入正題。要修改 .htaccess,你通常需要透過 FTP 或主機後台的檔案管理器。記得,在做任何修改之前,**一定、一定、一定要先備份你原本的 .htaccess 檔案!** 這樣就算改壞了,傳回去就能馬上救回來。
網站安全防護:先把門窗鎖好
安全是第一位的。這裡有幾個我覺得最基本也最重要的設定:
-
保護 .htaccess 本身:沒錯,這個檔案太重要了,我們不能讓任何人從瀏覽器直接看到它的內容。雖然在設定正確的伺服器上,它預設應該是受保護的,但多加一層防護總是好的。
# 保護 .htaccess 檔案 <Files .htaccess> order allow,deny deny from all </Files> -
保護重要的設定檔:像是 WordPress 的 `wp-config.php`,裡面有你的資料庫連線資訊,絕對不能外洩。
# 保護 wp-config.php 檔案 <Files wp-config.php> order allow,deny deny from all </Files> -
禁止目錄瀏覽 (Directory Listing):如果你的某個資料夾底下沒有 index.html 或 index.php 檔案,伺服器預設可能會直接把資料夾裡的所有檔案都列出來。這會洩漏你的網站結構,有安全風險。
# 禁止顯示目錄內容 Options -Indexes -
阻擋特定 IP:如果你發現一直有某個或某幾個 IP 在對你的網站做奇怪的事(例如:嘗試登入、大量爬取),你可以直接把它封鎖。
# 封鎖惡意 IP order allow,deny deny from 123.45.67.89 deny from 98.76.54.32 allow from all
SEO 優化配置:指揮交通,別讓權重迷路
SEO 的部分,.htaccess 最主要的工作就是「轉址」(Redirect),確保網站權重能集中在正確的網址上。
-
301 永久轉址:這是最重要的。當你把文章從舊網址換到新網址,或是整個網站換網域時,一定要做 301 轉址。這等於是告訴搜尋引擎:「嘿,這頁永久搬家了,請把舊頁面的所有權重都轉到新頁面去。」
如果你只是要轉址單一頁面,可以用 `Redirect 301`:
# 單一頁面轉址 Redirect 301 /old-page.html /new-page.html -
全站網址標準化 (Canonicalization):這就是要解決我前面那個客戶遇到的問題。你要決定你的「標準」網址是哪一種,通常是 `https://www.` 開頭的版本。然後把所有其他版本都用 301 轉址到這個標準版。這需要用到 `mod_rewrite` 模組,語法會複雜一點。
下面這個例子是把所有非 `https://www.yourdomain.com` 的流量,全部轉過去:
# 強制使用 HTTPS 和 WWW RewriteEngine On RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] RewriteRule ^ https://www.yourdomain.com%{REQUEST_URI} [L,R=301,NE]這個部分要特別小心,`yourdomain.com` 要換成你自己的網域,寫錯了網站就會無限轉址,直接掛掉。
-
移除網址中的 `index.php`:有些系統(例如早期的 Joomla 或 CodeIgniter)的網址會帶著 `index.php`,像 `yourdomain.com/index.php/about` 這樣,不太好看,對 SEO 也不算最優。 我們可以把它拿掉。
# 移除網址中的 index.php RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
情境差異:不是所有伺服器都吃這一套
這邊要特別提醒一個很重要的觀念。上面講的全部都是針對 **Apache Web Server**。 如果你的網站是放在 Nginx 或 LiteSpeed 這種不同的網頁伺服器上,那 .htaccess 檔案是完全沒有作用的! Nginx 有自己的設定檔 `nginx.conf`,語法也完全不同。
這點在選擇主機時就要注意。很多國外的 VPS 或雲端主機為了追求效能,會推薦使用 Nginx。例如 DigitalOcean 的教學文件就常提到 .htaccess 的效能問題。 但反過來說,台灣很多虛擬主機(Shared Hosting)還是以 Apache 為主,或是用 cPanel 控制台,這種環境下 .htaccess 就非常好用。 所以,動手前,請先確認你的主機環境是什麼,不要白忙一場。
另外,根據 Apache 官方文件的說法,如果能直接去改伺服器主設定檔 `httpd.conf`,效能會比用 .htaccess 來得好。 為什麼?因為 .htaccess 是「每次請求」伺服器都要從根目錄一路往下檢查到該檔案所在的目錄,看有沒有 .htaccess 檔案需要讀取,這會增加 I/O 負擔。 而 `httpd.conf` 是伺服器啟動時讀取一次就好。 不過呢,老實說,對於大部分中小型網站來說,這種效能差異幾乎感覺不到,而且虛擬主機的用戶也根本沒權限去碰 `httpd.conf`。 所以,.htaccess 提供的便利性還是遠大於那一點點的效能損耗。
常見錯誤與修正
玩 .htaccess 最刺激的就是除錯了。通常一個 500 Internal Server Error 出現,八成都是 .htaccess 搞的鬼。
| 常見錯誤 | 可能原因與我的碎碎念 | 修正方向 |
|---|---|---|
| 語法寫錯 (Syntax Error) | 最常見的!多一個空格、少一個斜線、指令拼錯字... Apache 看不懂就會直接罷工。我剛開始也超常犯這種錯。 | 一行一行檢查,特別是從網路上複製貼上的程式碼。可以先把可疑的那幾行前面加上 `#` 把它變成註解,看網站是否恢復正常,用刪去法找兇手。 |
| `mod_rewrite` 模組沒開 | 你寫了一堆 `RewriteRule`,結果伺服器根本沒開這個功能,當然沒用。現在大部分主機預設都開了,但萬一你用的是很精簡的自架環境... | 確認伺服器的 `mod_rewrite` 模組是否啟用。如果沒權限,就要問主機商。通常在 cPanel 裡會有相關設定。 |
| 無限迴圈的轉址 | 這個超慘,瀏覽器會顯示「重新導向次數過多」。通常是你轉址的條件寫得不夠精確,導致 A 轉到 B,B 又轉回 A。 | 仔細檢查你的 `RewriteCond` (條件) 和 `RewriteRule` (規則)。例如,你要把 HTTP 轉到 HTTPS,就要加一個條件是「當連線不是 HTTPS 時才轉」,不然轉過去之後又會再觸發一次規則。 |
| Windows 記事本的 BOM | 這是一個很隱密的坑!如果你用 Windows 內建的記事本去編輯 .htaccess,它存檔時可能會在檔案開頭偷偷加入一個叫 BOM 的隱藏字元,Apache 看到它就掛了。 | 千萬不要用 Windows 記事本!請用專業的程式碼編輯器,像是 VS Code、Sublime Text 或 Notepad++,並且存檔時選擇「UTF-8 (without BOM)」或「無 BOM 的 UTF-8」編碼。 |
總結一下我的想法
我知道,看完這一大堆,可能還是覺得 .htaccess 有點複雜。但說真的,你不需要一次全部搞懂。可以從最簡單的開始,例如先加個「禁止目錄瀏覽」,或是幫你的 `wp-config.php` 上鎖。這些都只是一兩行程式碼,但對網站安全就有實質的幫助。
等你有信心之後,再來挑戰 301 轉址或網址標準化這些 SEO 相關的設定。重點是,每做一步,就測試一下,然後記得随时備份。慢慢來,你會發現 .htaccess 其實是你管理網站的好朋友,而不是敵人。
你用 .htaccess 踩過最大的坑是什麼?或是有什麼我沒提到的獨門秘技?在下面留言分享一下吧!
