當然,web server並不是隨意進行壓縮,必須視browser有支援何種解壓縮功能,才用合適的壓縮方法進行壓縮。一般browser在送出request時:
GET /the-page HTTP/1.1
Host: www.the-web-site.com
Accept-Encoding: gzip, deflate
在Accept-Encoding這個header parameter中,就描述了browser可以處理的解壓縮方法。Web server則會視雙方都有支援的壓縮方法來進行壓縮。
目前市面上的browsers與web servers多已經支援HTTP compression的功能(HTTP compression測試工具)。一般web server並未開啟compression的功能,這裡以 Jetty 8/9來說明如何開啟這項功能。
首先找到web.xml,然後加入下列這段code:
<filter></filter>
<filter-name>GzipFilter</filter-name>
<filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
<init-param></init-param>
<param-name>mimeTypes</param-name>
<param-value>text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,application/x-javascript,application/json,image/svg+xml</param-value>
<filter-mapping></filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>/*</url-pattern>
這段設定是使用Jetty中所附的GzipFilter,可支援gzip與deflate的壓縮。
在init-param中定義了有那些MIME types是需要被壓縮的。一般而言,圖片、音樂(mp3...)、PDF等等都已經是經過壓縮的,所以並不建議再列入。
而在 url-pattern中則是定義了那個目錄要被壓縮,這裡設定整個網站目錄都列入範圍。
那要怎麼知道傳回來的是不是壓縮的格式。
可以打開browser的開發者工具,看看response headers的Content-Encoding是否為gzip等的壓縮方式。
後記:個人的測試,在Jetty 8上,好像request method只能用GET,如果用POST,則回傳資料不會壓縮。在一些文件中並沒有看到說POST的response不會壓縮。就不知是Jetty的因素?還是規格有這樣的限制了。等有空時再來研究這問題了。
沒有留言:
張貼留言