Apache: Gửi các tệp gzip'ed đóng gói sẵn


8

Tôi muốn Apache gửi các tệp tĩnh gzip'ed qua dây, nhưng cũng muốn Apache không phải lúc nào cũng nén chúng nhiều lần. Vì vậy, tôi nghĩ rằng nếu không thể gửi tệp .gz nếu nó tồn tại. Thiết lập này:

Cấu trúc tệp:

static/
|
|--- style.css
|
\--- style.css.gz

Và sau đây trong một .htaccess:

quy tắc mod_rewrite:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz [L]

Và cài đặt này:

AddEncoding x-gzip .gz

Trên thực tế, điều này hoạt động trong chừng mực khi tệp .gz được gửi thay vì .css, nếu yêu cầu được gửi đến /static/style.css. Vấn đề chỉ là, tệp được phân phối dưới dạng "application / x-gzip" chứ không phải là "text / css". Sử dụng cờ T của mod_rewrite không làm thay đổi điều này. Không rõ ràng

AddType text/css .css

Có ai có ý tưởng, làm thế nào tôi có thể đạt được hành vi mong muốn? Hoặc là không cần thiết vì một số lý do tôi đã không nghĩ?

EDIT: Có một khó khăn khác: Gửi tệp gốc đến máy khách mà không cần hỗ trợ gzip. Có ai biết làm thế nào điều này có thể làm việc?


Tôi ngạc nhiên vì điều này không rõ ràng hơn, vì dường như thật điên rồ khi có một máy chủ web không làm điều này. Tôi nghĩ rằng IIS có một hệ thống để lưu trữ các bản sao được nén của các tệp tĩnh trong lần truy cập đầu tiên. mod_deflate không đề cập đến một tính năng như vậy.
rjmunro

Tài liệu mod_deflate của apache có ví dụ của riêng họ ngay bây giờ: httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompced
cweiske

Câu trả lời:


5

Một giải pháp để gửi phiên bản chính xác tới các trình duyệt không chấp nhận gzip sẽ là một cái gì đó dọc theo dòng:

RewriteCond %{HTTP:Accept-Encoding} !gzip
...your rules here...

Ngoài ra, có một cách khác để thay đổi loại, đó là:

<FilesMatch .*\.css.gz>
    ForceType text/css
</FilesMatch>

<FilesMatch .*\.js.gz>
    ForceType text/javascript
</FilesMatch>

HTH.


Tuyệt thật, cảm ơn nhé! Có tài liệu nào cho% {HTTP: ...} không? Tôi đã không thấy bất kỳ đề cập nào về nó trong phần RewriteCond của Apache 2.2. FilesMatch là một ý tưởng khác mà tôi có nhưng tôi nghĩ nó dài dòng hơn. Vì cả hai quy tắc cần phải kích hoạt công cụ regrec, nên không có sự khác biệt thực sự.
Boldewyn

OK, tìm thấy các tài liệu. httpd.apache.org/docs/2.2/mod/mod_rewrite.html Tôi vừa bỏ qua phần thú vị.
Boldewyn

Đây không phải là một vấn đề lớn, nhưng đọc cấu hình đó, nếu ai đó tìm nạp tệp .css.gz theo cách thủ công, họ sẽ nhận được văn bản / css, khi họ sẽ nhận được loại ứng dụng / x-gzip.
rjmunro

Tại sao ! trước gzip trên dòng Chấp nhận mã hóa? Chắc chắn đó là điều ngược lại với những gì bạn cần?
rjmunro

Tôi đã suy nghĩ giống nhau, nó làm cho tinh thần để có RewriteCondchỉ phù hợp khi khách hàng không chấp nhận mã hóa gzip.
David Z

3

À, có vẻ như tôi đã tìm thấy một giải pháp: Cờ T không hoạt động nếu được đặt theo cùng một quy tắc, nhưng chắc chắn là như vậy, nếu bạn sử dụng quy tắc của riêng mình:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz

RewriteRule \.css\.gz$ - [T=text/css]
RewriteRule \.js\.gz$ - [T=text/javascript]

Tuy nhiên, tôi muốn nghe giải pháp và ý kiến ​​của người khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.