
.htaccess 是放在網站資料夾裡的設定檔,可以不用動主機的主設定,就做到轉址、強制 HTTPS、封鎖 IP、壓縮網頁、設定瀏覽器快取等等。WordPress 的「固定網址」也是靠它運作的。
這篇把最常用的設定整理成可以直接複製的版本,舊版文章裡已經過時的寫法也一併更新。
開始之前:三件事一定要知道
- 只適用 Apache 與 LiteSpeed 主機。Nginx 主機不讀
.htaccess,要改 Nginx 的設定檔(通常要請主機商處理)。大多數台灣的虛擬主機(cPanel、DirectAdmin、Plesk)都是 Apache 或 LiteSpeed。 - 改之前先備份。把原本的
.htaccess下載一份到電腦。寫錯一個字,整個網站可能出現「500 Internal Server Error」;這時候把剛剛加的那幾行刪掉、或換回備份就會恢復。 - 不要動 WordPress 自己的區塊。檔案裡
# BEGIN WordPress到# END WordPress之間是 WordPress 自動產生的,會被覆寫。自己的規則請加在這個區塊的上面。
.htaccess 是隱藏檔(檔名開頭是點),用 FTP 軟體時要打開「顯示隱藏檔」才看得到。
一、轉址
強制 HTTPS
網站裝好 SSL 憑證之後,把所有 http 的連線轉到 https:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]網站前面有 Cloudflare 之類的 CDN、或主機使用反向代理時,寫法不同,請看.htaccess 強制 HTTPS 寫法。
統一網址:有 www 或沒有 www
example.com 和 www.example.com 對搜尋引擎來說是兩個網址,應該統一成一個。下面兩段擇一使用,同時也會強制 https。
統一成有 www:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,R=301]統一成沒有 www:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]這兩段會自動抓網域名稱,不用改成自己的網址就能用。WordPress 網站記得同時到「設定 → 一般」,把兩個網址欄位改成一樣的格式。
單一頁面 301 轉址
頁面改了網址,舊網址要轉到新網址(搜尋排名也會跟著轉移):
Redirect 301 /old-page.html https://example.com/new-page/
Redirect 301 /old-folder/ https://example.com/new-folder/整個網站搬到新網域
Redirect 301 / https://new-domain.com/這行會把後面的路徑一起帶過去,例如舊站的 /about/team.html 會轉到 https://new-domain.com/about/team.html,所以新站的網址結構最好跟舊站一樣。這段是放在舊網域的 .htaccess 裡。
網址不顯示 .php 副檔名
讓 /about 自動對應到 about.php(非 WordPress 的自寫網站常用):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]二、安全防護
禁止瀏覽資料夾內容
資料夾裡沒有首頁檔時,有些主機會直接列出裡面所有檔案。加上這行就不會:
Options -Indexes保護隱藏檔(.git、.env 等)
開發時留下的 .git 資料夾或 .env 設定檔,被人下載可能會洩漏密碼。讓所有點開頭的檔案一律回「找不到」,但保留 SSL 憑證驗證要用的 .well-known:
RedirectMatch 404 /\.(?!well-known/)保護 wp-config.php 與備份檔
<Files "wp-config.php">
Require all denied
</Files>
<FilesMatch "\.(bak|config|dist|inc|ini|log|psd|sh|sql|swp)$|~$">
Require all denied
</FilesMatch>第二段會擋掉常被遺忘在網站上的備份檔、資料庫匯出檔、記錄檔。
封鎖特定 IP
<RequireAll>
Require all granted
Require not ip 203.0.113.10
Require not ip 198.51.100.0/24
</RequireAll>把 IP 換成要封鎖的位址,/24 代表一整段 IP。
後台只允許特定 IP 登入
放在 wp-admin 資料夾裡的 .htaccess(沒有就新增一個),只有你的 IP 能進後台:
<RequireAny>
Require ip 203.0.113.10
Require ip 198.51.100.20
</RequireAny>
<Files "admin-ajax.php">
Require all granted
</Files>admin-ajax.php 很多前台功能會用到(例如表單、購物車),所以要保持開放。家裡或公司的網路 IP 會變動的話,不建議用這招,不然哪天自己也進不去。
防止圖片被別的網站盜連
別人直接用你網站的圖片網址放在他們的網頁上,耗用的是你的主機流量。把 example.com 換成自己的網域:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/ [NC]
RewriteRule \.(jpe?g|png|gif|webp)$ - [F,NC,L]第一個條件是讓「直接輸入網址看圖」的人仍然看得到。注意:這樣設定之後,你的圖片在 LINE、Facebook 分享預覽裡也可能顯示不出來,要評估是否需要。
防止網頁被嵌入、加上安全標頭
<IfModule mod_headers.c>
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>X-Frame-Options:只有自己的網站可以用 iframe 嵌入你的網頁,防止被包裝成釣魚網站。X-Content-Type-Options:避免瀏覽器把檔案誤判成可執行的格式。Referrer-Policy:連到其他網站時,不把完整網址(可能含參數)送給對方。
用帳號密碼保護資料夾
先建立密碼檔(在主機的終端機執行,或用主機控制台的「目錄密碼保護」功能):
htpasswd -c /home/帳號/.htpasswd admin再在要保護的資料夾放 .htaccess:
AuthType Basic
AuthName "Restricted"
AuthUserFile /home/帳號/.htpasswd
Require valid-user.htpasswd 要放在網站公開目錄以外的地方,路徑要寫完整。
三、網站速度
壓縮網頁
讓 HTML、CSS、JavaScript 用壓縮的方式傳送,檔案通常能小一半以上:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
AddOutputFilterByType DEFLATE application/javascript application/json application/xml
AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>很多主機預設就開好了,詳細說明與檢查方法請看網站 GZIP、Brotli 壓縮總整理。
瀏覽器快取
讓訪客的瀏覽器把圖片、CSS、JavaScript 存起來,第二次進站就不用重新下載:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType font/woff2 "access plus 1 year"
</IfModule>CSS、JavaScript 設一年的前提是:檔案更新時檔名或網址會改變(WordPress 會在網址後面加上 ?ver= 版本號)。更完整的設定請看瀏覽器快取設定總整理。
四、其他常用設定
自訂錯誤頁面
ErrorDocument 404 /404.html
ErrorDocument 403 /403.htmlWordPress 網站不需要設定 404,主題本身就有找不到頁面的版面。
預設文字編碼
AddDefaultCharset utf-8修改 PHP 設定:php_value 要小心
舊教學常用這種寫法調整上傳大小、執行時間:
php_value upload_max_filesize 64M
php_value max_execution_time 300但現在大多數主機用的是 PHP-FPM 的執行方式,.htaccess 裡寫 php_value 會讓整個網站直接出現 500 錯誤。建議改用主機控制台的 PHP 設定(例如 cPanel 的「MultiPHP INI Editor」),或在網站根目錄放 .user.ini 檔案。做法可以參考WordPress 記憶體不足怎麼解決。
已經不需要的舊設定
這篇文章舊版還收錄了幾段現在不需要的設定:
- IE 相容模式(
X-UA-Compatible):IE 已在 2022 年停止支援,不用再設定。 - 用
AddHandler切換 PHP 版本:每家主機寫法不同,寫錯會讓網站無法執行,請改用主機控制台的「PHP 版本」設定。
改了沒效果、或網站壞掉了?
- 出現 500 錯誤:最近加的那段有語法錯誤,或主機不支援該功能,先刪掉恢復網站,再一段一段加回去找出問題。
- 完全沒效果:可能是主機沒有開啟
mod_rewrite、不允許使用.htaccess,或其實是 Nginx 主機,請詢問主機商。 - 轉址造成「重新導向次數過多」:通常是 CDN(例如 Cloudflare 的「彈性」SSL 模式)跟主機的轉址規則互相衝突,改成「完整」模式即可。
延伸閱讀
- .htaccess 強制 HTTPS 寫法:http 自動轉 https(WordPress、Joomla 適用)
- 網頁轉址與自動重新整理語法整理:301 轉址、meta refresh、JavaScript(WordPress 適用)
- WordPress「更新失敗。回應不是有效的 JSON 回應」怎麼解決?6 個原因與處理方法
主機、SSL、轉址這些設定一旦出錯,網站可能整個打不開。正威網路行銷是 25 年經驗的基隆網頁設計工作室,也提供網站維護託管,不想自己碰這些設定的話,歡迎來聊聊。







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