
打開網頁時,主機要把 HTML、CSS、JavaScript 這些檔案傳到訪客的瀏覽器。壓縮的意思是:主機先把檔案壓小再送出,瀏覽器收到後自動解開。整個過程訪客完全感覺不到,但傳輸量通常能少一半以上,手機網路慢的時候差別特別明顯。
這篇把網站壓縮相關的設定整理在一起:先教你檢查網站有沒有壓縮,再依照主機類型說明開啟方式,最後說明幾個已經過時的舊寫法。(原本另外兩篇〈plesk增加gzip壓縮〉與〈用代碼壓縮wordpress的html頁面〉的內容已經整合到這裡。)
第一步:先檢查網站有沒有壓縮
很多主機預設就開好了,網站前面有 Cloudflare 這類 CDN 的話,CDN 也會自動壓縮。所以動手之前,先確認現況:
- 用 Chrome 或 Edge 打開你的網站,按 F12 打開開發者工具,切到「Network(網路)」分頁。
- 按 F5 重新整理頁面。
- 點清單最上面那一筆(就是網頁本身,類型是 document)。
- 在「Headers(標頭)」裡的「Response Headers(回應標頭)」找到
content-encoding:
gzip:已經用 GZIP 壓縮。br:已經用 Brotli 壓縮。zstd:用較新的 Zstandard 格式壓縮,部分 CDN 會使用。- 找不到這一行:沒有壓縮,請往下看開啟方法。
想一次看所有檔案的狀況,可以在清單的欄位標題上按右鍵,選「Response Headers → Content-Encoding」,清單就會多出這一欄。
習慣用終端機的話(Mac、Linux),也可以用 curl 檢查,輸出裡有 content-encoding 就代表有壓縮:
curl -s -o /dev/null -D - -H "Accept-Encoding: gzip, br" https://example.com/圖片、影片沒有 content-encoding 是正常的。 JPG、PNG、WebP、WOFF2 字型、MP4 本身就是壓縮過的格式,再壓一次也不會變小,只是浪費主機效能。需要壓縮的是 HTML、CSS、JavaScript、SVG、JSON、XML 這類文字檔。
GZIP 和 Brotli 有什麼不同?
- GZIP:歷史最久,所有瀏覽器與主機都支援,是最基本的選擇。
- Brotli:Google 開發的較新格式,文字檔可以壓得比 GZIP 更小。現代瀏覽器都支援,但瀏覽器只會在 HTTPS 連線時使用。
兩種可以同時開啟。瀏覽器每次連線都會用 Accept-Encoding 標頭告訴主機自己支援哪些格式,主機再挑一種送出;不支援 Brotli 的情況會自動改用 GZIP,不會出錯。
虛擬主機通常只能自己開 GZIP,Brotli 需要主機在伺服器層級載入模組,一般要請主機商處理。只有 GZIP 也完全沒問題,GZIP 和 Brotli 的差距,遠不如「有壓縮」和「沒壓縮」那麼大。
壓縮和「最小化」不一樣
快取外掛裡常看到的「最小化(Minify)」,是把 CSS、JavaScript 檔案裡的空白、換行、註解真的刪掉;壓縮則是傳輸時暫時壓小,瀏覽器收到後還原。兩者可以同時使用,但壓縮的效果大得多,應該先確認壓縮有開。
Apache 主機:用 .htaccess 開啟
台灣很多虛擬主機是 Apache。用 FTP 或主機的檔案管理員打開網站根目錄的 .htaccess(它是隱藏檔,要開啟「顯示隱藏檔」才看得到;沒有就新增一個),先下載一份備份,然後在 # BEGIN WordPress 那一行的上面加入:
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript
AddOutputFilterByType DEFLATE application/javascript application/json application/ld+json
AddOutputFilterByType DEFLATE application/xml application/rss+xml application/atom+xml
AddOutputFilterByType DEFLATE application/manifest+json image/svg+xml image/x-icon
AddOutputFilterByType DEFLATE font/ttf font/otf
</IfModule>
</IfModule>mod_deflate是 Apache 負責壓縮的模組,名稱雖然叫 DEFLATE,實際送出的就是 GZIP 格式。- 外面兩層
IfModule的意思是「主機有這個模組才執行」,萬一主機沒有,也不會讓網站出現 500 錯誤。 - 清單裡只放文字類的檔案;圖片與 WOFF2 字型本身已經壓縮過,所以不列。
LiteSpeed 主機的壓縮通常由伺服器本身處理(LiteSpeed 也支援 Brotli),多半已經由主機商開好。先用上面的方法檢查,已經有壓縮就不用再加。
這篇舊版的寫法哪裡要改
舊版文章的程式碼現在大致還能運作,但有幾行已經沒有意義,甚至有反效果:
BrowserMatch那幾行:是為了 Netscape 4 與早期 IE 的壓縮問題而寫的,這些瀏覽器早就沒人使用,可以刪掉。Header append Vary User-Agent:會讓 CDN 和代理伺服器替每一種瀏覽器版本各存一份快取,快取幾乎失去作用。mod_deflate會自動加上正確的Vary: Accept-Encoding,這行請刪掉。application/x-httpd-php這類寫法:PHP 程式送出的網頁類型是text/html,這幾行不會有任何作用。
Nginx 主機
Nginx 不讀 .htaccess,要寫在 Nginx 的設定檔裡(通常要請主機商處理,自己管理的 VPS 才能直接改):
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types text/plain text/css text/xml text/javascript
application/javascript application/json application/ld+json
application/xml application/rss+xml application/atom+xml
application/manifest+json image/svg+xml image/x-icon
font/ttf font/otf;text/html只要開了gzip on就一定會壓縮,不用寫進gzip_types,寫了反而會出現重複設定的警告。gzip_comp_level是壓縮等級(1~9),數字越大壓得越小,但也越耗 CPU,5 左右是常見的折衷值。gzip_min_length讓太小的檔案不壓縮,壓了也省不了多少。- Nginx 要使用 Brotli,需要另外安裝 Brotli 模組,一般虛擬主機無法自己處理,請詢問主機商。
Plesk 主機
Plesk 預設是 Nginx 在前面、Apache 在後面一起運作,所以把壓縮設定加在 Nginx,就能涵蓋整個網站:
- 登入 Plesk,進入「網站與網域」,點選要設定的網域。
- 找到「Apache 與 nginx 設定」(Apache & nginx Settings)。
- 捲到最下面的其他 nginx 指令欄位(Additional nginx directives),貼上前面 Nginx 那一段設定。
- 儲存設定。
Plesk 儲存時會檢查設定內容。如果出現錯誤訊息,常見的原因是主機已經在其他地方設定過壓縮,這時候先用開頭的方法檢查,網站可能早就有壓縮了;還是不確定就請主機商協助。
原本另一篇 Plesk 文章的設定裡還有 gzip_disable "MSIE [1-6]\.(?!.*SV1)" 這一行,它是為了 IE6 以前的瀏覽器而寫的,現在不需要了。
cPanel 主機
很多 cPanel 主機有現成的壓縮開關,不用自己改檔案:
- 登入 cPanel,在上方搜尋欄輸入「Optimize」或「最佳化」,找到「最佳化網站」(Optimize Website)。
- 選擇壓縮所有內容(Compress All Content),或指定要壓縮的檔案類型。
- 按下更新設定(Update Settings)。
這個功能背後用的也是 mod_deflate,設定通常會寫進網站的 .htaccess。有些主機商的 cPanel 沒有這個選項,那就用前面 .htaccess 的方法,或直接請主機商開啟。
WordPress 需要裝外掛來開壓縮嗎?
不需要。壓縮是主機的工作,照上面的方法在主機端開好就可以。有些快取外掛會自動在 .htaccess 寫入壓縮規則,這也沒問題,只要確認最後網站確實有壓縮,同樣的規則不要重複貼好幾份就好。
用 PHP 壓縮 HTML 的舊做法,現在不需要了
原本另一篇文章教的是在主題的 functions.php 加一段程式,利用 ob_start() 攔下整個網頁,把換行、Tab、連續空白全部刪掉,讓 HTML 變小。這個做法不建議再使用,原因是:
- 開了 GZIP 或 Brotli 之後,效果幾乎可以忽略。 重複的空白與換行正是壓縮最擅長處理的東西,壓縮後只剩下非常少的位元組。
- 容易弄壞網頁。 網頁裡的 JavaScript 如果有
//註解,換行被刪掉之後,後面整段程式都會變成註解而失效;<pre>、<textarea>與程式碼區塊裡的換行也會不見。 - 在 PHP 8 會出現警告。 原本的程式碼有未定義的變數、陣列索引超出範圍等問題,開啟除錯模式時會顯示錯誤訊息。
- 跟快取外掛重複處理。 快取外掛也會攔截整個網頁的輸出,兩個一起用更容易出狀況。
如果真的想讓 HTML 更精簡,用快取外掛內建的 HTML 最小化選項就好,開啟後記得把網站各種頁面都點一遍,確認版面與功能正常。
同樣的道理,有些舊教學會在 functions.php 用 PHP 自己開啟 GZIP(例如 ob_gzhandler),壓縮請交給主機處理,不需要在程式裡另外做。
常見問題
開壓縮會不會讓主機變慢?
壓縮需要用到一點 CPU,但對一般網站來說,省下的傳輸時間遠比這點成本划算,這也是大多數主機預設就會開啟的原因。Nginx 的壓縮等級不要設到最高就好。
加了設定之後,網站出現 500 錯誤?
通常是貼上時少了字或多了符號。把剛剛加的那段刪掉,或換回備份的 .htaccess,網站就會恢復,再重新複製一次。
設定好了,檢查還是沒有壓縮?
- 確認主機是不是 Nginx(
.htaccess對 Nginx 沒有作用)。 - 確認主機有沒有啟用
mod_deflate,沒有的話IfModule會讓整段設定被略過,要請主機商開啟。 - 有快取外掛或 CDN 的話,先清除快取再檢查。
延伸閱讀
- 瀏覽器快取設定總整理:.htaccess 的 Expires、Cache-Control 寫法與檔案更新不生效的解法
- WordPress 網站加速完整攻略:測速、主機、快取、圖片、外掛與資料庫清理
- .htaccess 用法大全:轉址、HTTPS、安全防護、壓縮與快取常用設定(WordPress 適用)
壓縮、快取這類主機層級的設定,做一次就能讓整個網站受益。正威網路行銷是 25 年經驗的基隆網頁設計工作室,也提供網站維護託管,想找人幫忙檢查網站速度,歡迎來聊聊。







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