2013-06-02 22 views
19

Tôi lưu trữ một trò chơi JavaScript về cơ bản bao gồm tệp .html và .data. Nếu tôi nén chúng bằng gzip, kích thước của chúng sẽ co lại thành 25%. Vì vậy, tôi muốn làm điều đó.Cách lưu trữ nội dung tĩnh được nén trước trong apache?

Tôi không chắc chắn 100%, nhưng tôi nghĩ rằng việc sử dụng mod_gzip hoặc mod_deflate thực hiện nén trực tiếp, lãng phí thời gian cpu bởi vì Nội dung không thay đổi.

Vì vậy, I'ld muốn biên dịch trước nội dung. Vì vậy, tôi đặt một gz bên cạnh các tập tin nén và đặt viết lại quy tắc trong .htaccess:

RewriteEngine on 
# If client accepts compressed files 
RewriteCond %{HTTP:Accept-Encoding} gzip 
# and if compressed file exists 
RewriteCond %{REQUEST_FILENAME}.gz -f 
# send .html.gz instead of .html 
RewriteRule ^(.+)\.(html|css|js|data)$ $1.$2.gz [T=text/$2,E=GZIP:gzip,L] 
Header set Content-Encoding gzip env=GZIP 

Các Redirect đang làm việc, tôi có thể yêu cầu game.html và thực sự có được game.html.gz. deliviered Tuy nhiên, trình duyệt không chỉ hiển thị nó. Thay vào đó, nó hỏi tôi nơi lưu tệp. Lam sao tôi co thể sửa no? Hoặc có thể có một cách khác để đạt được Mục tiêu của tôi?

+0

Dường như apache không tôn trọng công cụ sửa đổi T. Máy chủ thực sự loại nội dung gì? – claustrofob

+0

Thật khó cho tôi để tìm hiểu. Firebug không Báo cáo kiểu Nội dung khi ff muốn lưu tệp - hoặc tôi không biết cách xem nó. – marc40000

Trả lời

16

Đây là cách tôi cố định một lần cùng một vấn đề.

Thêm loại mới trong .htaccess:

AddEncoding gzip .jsgz .cssgz .htmlgz .datagz 
AddType application/javascript .jsgz 
AddType text/css .cssgz 
AddType text/html .htmlgz  
AddType text/plain .datagz 

này được thực hiện theo cách này vì AddType hướng dẫn đã không chấp nhận mở rộng theo hình thức .html.gz.

Sau đó sửa đổi quy tắc viết lại của bạn:

RewriteRule ^(.+)\.(html|css|js|data)$ $1.$2gz [L] 

Và cuối cùng đổi tên tập tin của bạn. Xóa các dấu chấm khỏi .html.gz, .js.gz và v.v.

Các .htaccess đầy đủ sẽ trông như thế này:

AddEncoding gzip .jsgz .cssgz .htmlgz .datagz 
AddType application/x-javascript .jsgz 
AddType text/css .cssgz 
AddType text/html .htmlgz  
AddType text/plain .datagz 

RewriteEngine on 
# If client accepts compressed files 
RewriteCond %{HTTP:Accept-Encoding} gzip 
# and if compressed file exists 
RewriteCond %{REQUEST_FILENAME}gz -f 
# send .html.gz instead of .html 
RewriteRule ^(.+)\.(html|css|js|data)$ $1.$2gz [L] 
+0

Điều quan trọng là phải có các phần mở rộng có tên như thế? Bởi vì tôi đã thử giải pháp của bạn bằng cách thay thế .htmlgz bằng .html.gz và cứ thế, nó yêu cầu lưu tệp thay vì hiển thị nó. – marc40000

+0

Nó thực sự có vẻ là rất quan trọng đối với một số lý do. Nếu tôi đổi tên các tệp .html.gz thành .htmlgz, v.v., sử dụng công cụ .htaccess được đề xuất của bạn. – marc40000

+2

giải pháp này thực sự hoạt động trên một dự án trực tiếp trong nhiều năm. Nếu AddType sẽ hỗ trợ các phần mở rộng phức tạp như .html.gz bạn không thể đổi tên các tệp. – claustrofob

9

Câu hỏi đầu tiên bạn nên tự hỏi là, có điểm nào trong việc thực hiện điều này không? Bạn có nhận thấy quá tải CPU và/hoặc hiệu suất khác biệt vì điều này không? Đoán của tôi có thể là bạn có thể không gặp vấn đề này :)

Dù vậy, có nhiều cách để khắc phục sự cố của bạn.

  1. Có lẽ là lựa chọn tốt nhất cho bạn, sử dụng CDN. Chúng được thiết kế để phân phối nhanh các tệp tĩnh và sẽ làm cho nó nhanh chóng cho những người ở một khu vực địa lý khác nhau cũng như những người gần máy chủ của bạn. Ngoài ra, trong kinh nghiệm của tôi, CDN thường rẻ hơn nhiều so với băng thông của chính bạn.

  2. Sử dụng Nginx. Để lưu trữ các tệp tĩnh nhiều hơn nhanh hơn và có hỗ trợ cho việc tạo trước nội dung tĩnh như bạn đang làm ngay bây giờ. Nó sẽ tự động phát hiện nếu có tệp .gz và phân phối thay vào đó khi cần.

  3. Sử dụng một trong các cơ chế bộ nhớ cache Apache như mod_mem_cache hoặc mod_disk_cache để đảm bảo rằng mọi tệp được sử dụng thường xuyên sẽ nằm trong bộ nhớ cache. Hướng dẫn: http://webdirect.no/linux/apache-caching-with-gzip-enabled/

  4. Sử dụng proxy caching như Varnish ở phía trước, các loại máy chủ này có cơ chế lưu bộ nhớ cache thông minh hơn nhiều và thực sự lưu trữ các tệp quan trọng nhất.

Đối với phiên bản hiện tại của bạn tuy nhiên, một cái gì đó như thế này (chưa được kiểm tra) nên làm các trick:

RewriteEngine On  
RewriteCond %{HTTP:Accept-encoding} gzip 
RewriteCond %{REQUEST_FILENAME}\.gz -s 
RewriteRule ^(.*)\.(html|css|js|data) $1\.$2\.gz [QSA] 

# Prevent double gzip and give the correct mime-type 
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=FORCE_GZIP] 
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=FORCE_GZIP] 
RewriteRule \.html\.gz$ - [T=text/html,E=no-gzip:1,E=FORCE_GZIP] 
RewriteRule \.data\.gz$ - [T=text/plain,E=no-gzip:1,E=FORCE_GZIP] 

Header set Content-Encoding gzip env=FORCE_GZIP 
+0

Các lựa chọn thay thế thú vị mà bạn viết ở đó. Trong khi nginx và véc ni có lẽ không phải vì tôi đã cài đặt Apache và không muốn cài đặt tất cả điều đó cho hai tệp. 1 hoặc 3 có vẻ là lựa chọn thú vị cho tôi để điều tra. Tuy nhiên, chỉ cần sửa chữa .htaccess có vẻ là tùy chọn nhanh nhất cho tôi ngay bây giờ. Tôi đã thử đề xuất của bạn: Nó không yêu cầu lưu tệp nữa, nhưng nó không giải nén nó trước khi hiển thị. Tôi thấy tệp nén, rất nhiều ký tự. Tôi đã thử nghiệm trong Firefox và Chrome. – marc40000

+0

Khi bao gồm các trình duyệt có thể đủ thông minh để làm điều đó đúng, nhưng tôi thực sự quên để vượt qua mã hóa cùng. Tôi sẽ cập nhật câu trả lời :) – Wolph

+0

Tôi sử dụng phương pháp tương tự này ngoại trừ tôi sử dụng nó trong một script perl mod chạy trước bất kỳ CGI nào. Điều này cho phép tôi cũng lấy các tập tin cụ thể của động cơ nếu cần. ví dụ: /file.js -> file.jscript.js.gz ví dụ: file.gecko.js.gz cho firefox, file.v8.js.gz cho chrome hoặc file.nitro.js.gz cho safari. Hoạt động tương tự với CSS, nhưng dựa trên kết xuất của nó thay vì công cụ js, đinh ba cho ví dụ, gecko cho firefox, webkit cho chrome và safari. Nếu nó không thể tìm thấy trình duyệt cụ thể, nó sử dụng tệp mặc định.js.gz. Nó cũng đưa vào tài khoản phiên bản phần mềm cũng như cho khách hàng. – Rahly

6

Câu trả lời được chấp nhận có vẻ khá đau đớn. Wolph's answer có vẻ tốt hơn, nhưng vẫn yêu cầu cấu hình riêng cho từng phần mở rộng tệp và thiếu hỗ trợ cho thương lượng nâng cao hơn (q-values, status 406, TCN, v.v.). Thay vì tự mình triển khai content negotiation bằng cách sử dụng mod_rewrite, bạn có thể cân nhắc sử dụng mod_negotiation như được thảo luận trong this question. Sao chép my answer từ đó:

Options +MultiViews 
RemoveType .gz 
AddEncoding gzip .gz 
<FilesMatch ".+\.tar\.gz$"> 
    RemoveEncoding .gz 
    # Note: Can use application/x-gzip for backwards-compatibility 
    AddType application/gzip .gz 
</FilesMatch> 

này có thêm tiền thưởng làm việc cho tất cả .gz file chứ không phải là những người duy nhất rõ ràng cấu hình và được dễ dàng mở rộng cho brotli hoặc mã hóa khác.

Nó có một nhược điểm lớn, vì only requests for files which do not exist are negotiated một file có tên foo.js sẽ đưa ra yêu cầu cho /foo.js (nhưng không /foo) trả về phiên bản không nén. Điều này có thể tránh được bằng cách sử dụng François Marier's solution đổi tên các tệp không nén với tiện ích mở rộng đôi, do đó, foo.js được triển khai dưới dạng foo.js.js.

Các vấn đề liên quan