0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

.htaccess 用法大全:轉址、HTTPS、安全防護、壓縮與快取常用設定(WordPress 適用)

伺服器與機器人的立體插圖

.htaccess 是放在網站資料夾裡的設定檔,可以不用動主機的主設定,就做到轉址、強制 HTTPS、封鎖 IP、壓縮網頁、設定瀏覽器快取等等。WordPress 的「固定網址」也是靠它運作的。

這篇把最常用的設定整理成可以直接複製的版本,舊版文章裡已經過時的寫法也一併更新。

開始之前:三件事一定要知道

  1. 只適用 Apache 與 LiteSpeed 主機。Nginx 主機不讀 .htaccess,要改 Nginx 的設定檔(通常要請主機商處理)。大多數台灣的虛擬主機(cPanel、DirectAdmin、Plesk)都是 Apache 或 LiteSpeed。
  2. 改之前先備份。把原本的 .htaccess 下載一份到電腦。寫錯一個字,整個網站可能出現「500 Internal Server Error」;這時候把剛剛加的那幾行刪掉、或換回備份就會恢復。
  3. 不要動 WordPress 自己的區塊。檔案裡 # BEGIN WordPress 到 # END WordPress 之間是 WordPress 自動產生的,會被覆寫。自己的規則請加在這個區塊的上面。

.htaccess 是隱藏檔(檔名開頭是點),用 FTP 軟體時要打開「顯示隱藏檔」才看得到。

一、轉址

強制 HTTPS

網站裝好 SSL 憑證之後,把所有 http 的連線轉到 https:

Apache (.htaccess)
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:

Apache (.htaccess)
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:

Apache (.htaccess)
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 轉址

頁面改了網址,舊網址要轉到新網址(搜尋排名也會跟著轉移):

Apache (.htaccess)
Redirect 301 /old-page.html https://example.com/new-page/
Redirect 301 /old-folder/ https://example.com/new-folder/

整個網站搬到新網域

Apache (.htaccess)
Redirect 301 / https://new-domain.com/

這行會把後面的路徑一起帶過去,例如舊站的 /about/team.html 會轉到 https://new-domain.com/about/team.html,所以新站的網址結構最好跟舊站一樣。這段是放在舊網域的 .htaccess 裡。

網址不顯示 .php 副檔名

讓 /about 自動對應到 about.php(非 WordPress 的自寫網站常用):

Apache (.htaccess)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]

二、安全防護

禁止瀏覽資料夾內容

資料夾裡沒有首頁檔時,有些主機會直接列出裡面所有檔案。加上這行就不會:

Apache (.htaccess)
Options -Indexes

保護隱藏檔(.git、.env 等)

開發時留下的 .git 資料夾或 .env 設定檔,被人下載可能會洩漏密碼。讓所有點開頭的檔案一律回「找不到」,但保留 SSL 憑證驗證要用的 .well-known:

Apache (.htaccess)
RedirectMatch 404 /\.(?!well-known/)

保護 wp-config.php 與備份檔

Apache (.htaccess)
<Files "wp-config.php">
  Require all denied
</Files>

<FilesMatch "\.(bak|config|dist|inc|ini|log|psd|sh|sql|swp)$|~$">
  Require all denied
</FilesMatch>

第二段會擋掉常被遺忘在網站上的備份檔、資料庫匯出檔、記錄檔。

封鎖特定 IP

Apache (.htaccess)
<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 能進後台:

Apache (.htaccess)
<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 換成自己的網域:

Apache (.htaccess)
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/ [NC]
RewriteRule \.(jpe?g|png|gif|webp)$ - [F,NC,L]

第一個條件是讓「直接輸入網址看圖」的人仍然看得到。注意:這樣設定之後,你的圖片在 LINE、Facebook 分享預覽裡也可能顯示不出來,要評估是否需要。

防止網頁被嵌入、加上安全標頭

Apache (.htaccess)
<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:連到其他網站時,不把完整網址(可能含參數)送給對方。

用帳號密碼保護資料夾

先建立密碼檔(在主機的終端機執行,或用主機控制台的「目錄密碼保護」功能):

Shell / 終端機
htpasswd -c /home/帳號/.htpasswd admin

再在要保護的資料夾放 .htaccess:

Apache (.htaccess)
AuthType Basic
AuthName "Restricted"
AuthUserFile /home/帳號/.htpasswd
Require valid-user

.htpasswd 要放在網站公開目錄以外的地方,路徑要寫完整。

三、網站速度

壓縮網頁

讓 HTML、CSS、JavaScript 用壓縮的方式傳送,檔案通常能小一半以上:

Apache (.htaccess)
<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 存起來,第二次進站就不用重新下載:

Apache (.htaccess)
<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= 版本號)。更完整的設定請看瀏覽器快取設定總整理。

四、其他常用設定

自訂錯誤頁面

Apache (.htaccess)
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html

WordPress 網站不需要設定 404,主題本身就有找不到頁面的版面。

預設文字編碼

Apache (.htaccess)
AddDefaultCharset utf-8

修改 PHP 設定:php_value 要小心

舊教學常用這種寫法調整上傳大小、執行時間:

Apache (.htaccess)
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 模式)跟主機的轉址規則互相衝突,改成「完整」模式即可。

延伸閱讀

主機、SSL、轉址這些設定一旦出錯,網站可能整個打不開。正威網路行銷是 25 年經驗的基隆網頁設計工作室,也提供網站維護託管,不想自己碰這些設定的話,歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

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

讓我們一起打造
您的專屬網站!