0%

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

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

網站 GZIP、Brotli 壓縮總整理:Apache、Nginx、Plesk、cPanel 開啟與檢查方法

資料中心的立體插圖

打開網頁時,主機要把 HTML、CSS、JavaScript 這些檔案傳到訪客的瀏覽器。壓縮的意思是:主機先把檔案壓小再送出,瀏覽器收到後自動解開。整個過程訪客完全感覺不到,但傳輸量通常能少一半以上,手機網路慢的時候差別特別明顯。

這篇把網站壓縮相關的設定整理在一起:先教你檢查網站有沒有壓縮,再依照主機類型說明開啟方式,最後說明幾個已經過時的舊寫法。(原本另外兩篇〈plesk增加gzip壓縮〉與〈用代碼壓縮wordpress的html頁面〉的內容已經整合到這裡。)

第一步:先檢查網站有沒有壓縮

很多主機預設就開好了,網站前面有 Cloudflare 這類 CDN 的話,CDN 也會自動壓縮。所以動手之前,先確認現況:

  1. 用 Chrome 或 Edge 打開你的網站,按 F12 打開開發者工具,切到「Network(網路)」分頁。
  2. 按 F5 重新整理頁面。
  3. 點清單最上面那一筆(就是網頁本身,類型是 document)。
  4. 在「Headers(標頭)」裡的「Response Headers(回應標頭)」找到 content-encoding:
    • gzip:已經用 GZIP 壓縮。
    • br:已經用 Brotli 壓縮。
    • zstd:用較新的 Zstandard 格式壓縮,部分 CDN 會使用。
    • 找不到這一行:沒有壓縮,請往下看開啟方法。

想一次看所有檔案的狀況,可以在清單的欄位標題上按右鍵,選「Response Headers → Content-Encoding」,清單就會多出這一欄。

習慣用終端機的話(Mac、Linux),也可以用 curl 檢查,輸出裡有 content-encoding 就代表有壓縮:

Shell / 終端機
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 那一行的上面加入:

Apache (.htaccess)
<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 才能直接改):

Nginx
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,就能涵蓋整個網站:

  1. 登入 Plesk,進入「網站與網域」,點選要設定的網域。
  2. 找到「Apache 與 nginx 設定」(Apache & nginx Settings)。
  3. 捲到最下面的其他 nginx 指令欄位(Additional nginx directives),貼上前面 Nginx 那一段設定。
  4. 儲存設定。

Plesk 儲存時會檢查設定內容。如果出現錯誤訊息,常見的原因是主機已經在其他地方設定過壓縮,這時候先用開頭的方法檢查,網站可能早就有壓縮了;還是不確定就請主機商協助。

原本另一篇 Plesk 文章的設定裡還有 gzip_disable "MSIE [1-6]\.(?!.*SV1)" 這一行,它是為了 IE6 以前的瀏覽器而寫的,現在不需要了。

cPanel 主機

很多 cPanel 主機有現成的壓縮開關,不用自己改檔案:

  1. 登入 cPanel,在上方搜尋欄輸入「Optimize」或「最佳化」,找到「最佳化網站」(Optimize Website)。
  2. 選擇壓縮所有內容(Compress All Content),或指定要壓縮的檔案類型。
  3. 按下更新設定(Update Settings)。

這個功能背後用的也是 mod_deflate,設定通常會寫進網站的 .htaccess。有些主機商的 cPanel 沒有這個選項,那就用前面 .htaccess 的方法,或直接請主機商開啟。

WordPress 需要裝外掛來開壓縮嗎?

不需要。壓縮是主機的工作,照上面的方法在主機端開好就可以。有些快取外掛會自動在 .htaccess 寫入壓縮規則,這也沒問題,只要確認最後網站確實有壓縮,同樣的規則不要重複貼好幾份就好。

用 PHP 壓縮 HTML 的舊做法,現在不需要了

原本另一篇文章教的是在主題的 functions.php 加一段程式,利用 ob_start() 攔下整個網頁,把換行、Tab、連續空白全部刪掉,讓 HTML 變小。這個做法不建議再使用,原因是:

  1. 開了 GZIP 或 Brotli 之後,效果幾乎可以忽略。 重複的空白與換行正是壓縮最擅長處理的東西,壓縮後只剩下非常少的位元組。
  2. 容易弄壞網頁。 網頁裡的 JavaScript 如果有 // 註解,換行被刪掉之後,後面整段程式都會變成註解而失效;<pre>、<textarea> 與程式碼區塊裡的換行也會不見。
  3. 在 PHP 8 會出現警告。 原本的程式碼有未定義的變數、陣列索引超出範圍等問題,開啟除錯模式時會顯示錯誤訊息。
  4. 跟快取外掛重複處理。 快取外掛也會攔截整個網頁的輸出,兩個一起用更容易出狀況。

如果真的想讓 HTML 更精簡,用快取外掛內建的 HTML 最小化選項就好,開啟後記得把網站各種頁面都點一遍,確認版面與功能正常。

同樣的道理,有些舊教學會在 functions.php 用 PHP 自己開啟 GZIP(例如 ob_gzhandler),壓縮請交給主機處理,不需要在程式裡另外做。

常見問題

開壓縮會不會讓主機變慢?

壓縮需要用到一點 CPU,但對一般網站來說,省下的傳輸時間遠比這點成本划算,這也是大多數主機預設就會開啟的原因。Nginx 的壓縮等級不要設到最高就好。

加了設定之後,網站出現 500 錯誤?

通常是貼上時少了字或多了符號。把剛剛加的那段刪掉,或換回備份的 .htaccess,網站就會恢復,再重新複製一次。

設定好了,檢查還是沒有壓縮?

  • 確認主機是不是 Nginx(.htaccess 對 Nginx 沒有作用)。
  • 確認主機有沒有啟用 mod_deflate,沒有的話 IfModule 會讓整段設定被略過,要請主機商開啟。
  • 有快取外掛或 CDN 的話,先清除快取再檢查。

延伸閱讀

壓縮、快取這類主機層級的設定,做一次就能讓整個網站受益。正威網路行銷是 25 年經驗的基隆網頁設計工作室,也提供網站維護託管,想找人幫忙檢查網站速度,歡迎來聊聊。

分享這篇文章

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

發表留言

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

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