什麼是 .htaccess?為什麼它能直接控制網站行為?
在 Linux 虛擬主機環境中,.htaccess 並不是網站程式的一部分,
而是 Apache Web Server 提供的一種「目錄層級設定檔(Directory Context)」。
當使用者瀏覽網站時,請求會先進入 Apache,
Apache 會依照實體目錄結構逐層讀取 .htaccess,
判斷是否需要轉址、是否允許存取、是否調整快取或錯誤頁,
最後才將請求交給 PHP 或直接回傳檔案。
因此 .htaccess 影響的是「網站行為層級」,
而不是單一程式碼檔案。
為什麼只有 Linux 主機才有 .htaccess?
.htaccess 是 Apache Web Server 專用的設定機制,
主要存在於 Linux / Unix 類型主機環境中。
Windows 主機多半使用 IIS(Internet Information Services),
其設定方式不同,改用 web.config,
因此不支援 .htaccess。
.htaccess、PHP、php.ini、CloudLinux 與 MultiPHP 的關係
許多使用者會嘗試在網站目錄中自行建立 php.ini 來修改 PHP 設定,
卻發現實際上並沒有生效。
這通常不是設定錯誤,而是主機架構與權限層級不同所造成的結果。
.htaccess 的角色是控制 Apache 如何處理請求,
而不是直接用來調整 PHP 參數。
在目前多數 cPanel Linux 主機中,
主機商會搭配 CloudLinux 與
MultiPHP / PHP-FPM 使用,
PHP 的可調整項目已集中於 cPanel 介面中,
而非讓使用者直接修改 php.ini。
一般可調整的 PHP 設定,
會在 cPanel 的
「Select PHP Version → Options」 內提供,
這些選項是由主機商預先開放的安全範圍。
Select PHP Version實際操作教學可參考:https://wpoki.com/?p=6168
簡單來說:
- 要調整 PHP 行為 → 使用 cPanel 提供的設定介面
- 要控制網站行為 → 使用 .htaccess
.htaccess 常見用途總覽
.htaccess 可用來控制多種網站行為,以下列出在 Linux 虛擬主機環境中
最常見、也最實用的幾種用途。
1. 網址重寫(mod_rewrite)
可將動態網址改寫為 SEO 友善網址,
也是 WordPress 永久連結能正常運作的必要條件。
教學參考:https://wpoki.com/?p=5695
2. 網頁或目錄保護
可限制特定資料夾僅允許登入或指定 IP 存取,
常用於測試站、後台或不對外公開的目錄。
教學參考:https://wpoki.com/?p=5989
3. 防止目錄列出(Indexes)
避免訪客直接瀏覽資料夾內的檔案清單,
是非常基本但重要的安全設定。
教學參考:https://wpoki.com/?p=5977
4. 阻擋壞 Bot 或惡意爬蟲
當網站出現大量異常流量、資源被耗用,
或發現特定 Bot 不斷存取網站時,
可以透過 .htaccess 在 Apache 層級直接拒絕請求,
比 robots.txt 更具強制性。
常見做法是依據 User-Agent 進行阻擋,
例如:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (badbot|evilbot|crawler) [NC]
RewriteRule .* - [F,L]
</IfModule>
完整範例與進階設定方式,可參考以下教學:https://wpoki.com/?p=5707
提醒:阻擋規則應定期檢查,
避免誤封搜尋引擎或正常訪客。
5. 自訂錯誤頁面(404 / 500)
可為網站指定自訂錯誤頁面,
改善使用者體驗並避免顯示系統預設錯誤畫面。
ErrorDocument 404 /404.html ErrorDocument 500 /500.html
錯誤頁檔案需放在網站可存取的位置,
不建議直接轉回首頁,以免搜尋引擎誤判。
6. 設定 MIME 類型
當檔案下載或顯示行為異常時,
通常與 MIME 類型設定有關,
可透過 .htaccess 指定正確類型。
AddType application/pdf .pdf AddType image/webp .webp
這能確保瀏覽器以正確方式處理檔案,
避免出現「應該顯示卻變成下載」的情況。
7.使用 .htaccess 關閉快取的實際用途
在修改網站樣式或除錯時,
瀏覽器快取可能導致畫面未即時更新。
此時可透過 .htaccess 暫時關閉快取:
<IfModule mod_headers.c> Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires 0 </IfModule>
此設定不建議長期使用,
完成測試後應移除以恢復效能。
以上用途已涵蓋多數虛擬主機使用情境,
其餘更進階的 Apache 設定,
通常會被限制在伺服器層級,無法透過 .htaccess 使用。
為什麼 .htaccess 一行錯就會 500 Internal Server Error?
與 PHP 或 HTML 不同,.htaccess 是 Apache 在
每一次請求當下即時解析的設定檔,
而不是等到程式執行時才處理。
只要 Apache 在解析 .htaccess 時發現以下任一情況:
- 語法錯誤(例如少了符號、括號未關閉)
- 使用了主機未啟用的模組(如 mod_rewrite、mod_headers)
- 將指令放在不支援的環境中
Apache 就會直接中止該目錄的服務,
並回傳 500 Internal Server Error,
而不會嘗試忽略錯誤繼續執行。
這也是為什麼常見情況是:
- 只改了一行 .htaccess,整個網站卻無法存取
- 移除該行後,網站立刻恢復正常
這並不是網站程式壞掉,
而是 Apache 無法安全解析該目錄的設定所造成的保護機制。
因此在實務上建議:
- 修改 .htaccess 前先備份原始檔案
- 一次只調整一小段設定
- 修改後立即測試,確認未出現 500 Error
只要養成這些習慣,就能大幅降低因 .htaccess 設定錯誤而導致網站無法存取的風險。
.htaccess 上下層目錄規則概念
在 Apache 的運作機制中,.htaccess 並不是只讀取單一檔案,
而是會依照實體目錄結構由上而下逐層套用規則。
舉例來說,若你的目錄結構如下:
/public_html/
└─ .htaccess
└─ blog/
└─ .htaccess
當使用者存取 /blog/ 下的頁面時,
Apache 會先讀取 /public_html/.htaccess,
接著再讀取 /public_html/blog/.htaccess,
兩者的設定都會生效,而不是二選一。
若上下層的設定發生衝突,原則上是:
- 上層規則先套用
- 下層規則後套用
- 下層僅能覆蓋「部分可覆蓋的指令」
例如:
- Rewrite 規則、Header 設定,通常可由下層覆蓋
- 安全性與權限相關設定(如封鎖、目錄限制),多半無法由下層放寬
因此,子目錄的 .htaccess 無法完全忽略或停用上層設定,
只能在 Apache 允許的範圍內進行補充或覆寫。
若真的需要讓某個目錄完全不受上層規則影響,
通常必須修改 Apache 的主設定(VirtualHost 或 Server Config),
在虛擬主機環境中幾乎無法做到。
如何在 cPanel 顯示 .htaccess
-
- 登入 cPanel
- 開啟「檔案管理員」
- 右上角點擊「設定」
- 勾選「顯示隱藏檔案(. 開頭)」
- 按下「GO」
常見問題
Q1.”.htaccess” 是什麼?一定每個 Linux 主機都有嗎?
.htaccess 是 Apache Web Server 提供的目錄層級設定檔,大多數 Linux 虛擬主機都支援。
但若主機商在伺服器層級關閉此功能,使用者仍可能無法使用。
Q2.為什麼 Windows 主機沒有 “.htaccess”?
Windows 主機通常使用 IIS 作為 Web Server,其設定方式與 Apache 不同,
因此改用 web.config,而不支援 .htaccess。
Q3.為什麼我修改了 php.ini 或 “.htaccess”,PHP 設定卻沒有生效?
在多數 cPanel 主機中,PHP 會搭配 CloudLinux 與 MultiPHP 使用,
PHP 設定通常需透過 cPanel 的「Select PHP Version → Options」介面調整,
自行建立的 php.ini 或在 .htaccess 中設定 PHP 參數往往不會生效。
Q4.什麼情況下適合用 “.htaccess” 關閉快取?
.htaccess 關閉快取適合用於網站開發、除錯或修改樣式時,
可避免瀏覽器或伺服器快取造成畫面未即時更新。
不建議長期關閉,以免影響效能與 SEO。
Q5.為什麼 “.htaccess” 一行寫錯就會出現 500 Internal Server Error?
.htaccess 是 Apache 即時解析的設定檔,只要語法錯誤或使用不支援的指令,
Apache 便會直接中止該目錄服務並回傳 500 Error。
建議修改前先備份原檔。
Q6.子目錄的 “.htaccess” 可以完全不受上層影響嗎?
不行。Apache 會逐層套用所有 .htaccess 規則,
子目錄只能覆蓋部分設定(如 Rewrite 或 Header),
無法完全忽略上層的安全或權限相關設定。
Q7.”.htaccess” 阻擋壞 Bot 和 robots.txt 有什麼差別?
robots.txt 只是一種「建議」,惡意 Bot 往往不會遵守;
.htaccess 則是在 Apache 層級直接拒絕請求,
對於阻擋壞 Bot 或異常爬蟲更具強制性。
Q8.修改 “.htaccess” 前需要注意哪些事情?
建議修改前先備份原本的 .htaccess,
一次只調整一小段設定並立即測試,
若出現 500 Error,可快速還原以避免網站長時間無法存取。
CPANEL 虛擬主機相關教學總覽
文章來源:https://wpoki.com
GIPHY App Key not set. Please check settings