Cách chỉ định tiêu đề “Vary: Accept-Encoding” trong .htaccess


81

Google PageSpeed ​​cho biết tôi nên "Chỉ định tiêu đề Vary: Accept-Encoding" cho JS và CSS. Làm cách nào để thực hiện việc này trong .htaccess?


22
Không chắc tại sao điều này bị đóng, chỉ vì nó không liên quan đến ngôn ngữ lập trình không có nghĩa là nó không liên quan đến mã hóa.
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft Tôi đồng ý, điều này đã được xem hơn 65100 lần vì vậy tôi nghĩ đó là một chủ đề được tìm kiếm nhiều chưa kể tôi trả lời các câu hỏi htaccess hàng ngày.
Panama Jack

Tôi biết điều này là địa ngục, nhưng tiêu đề Vary: Accept-Encodingsẽ yêu cầu trình duyệt lưu trữ trong bộ nhớ cache một phiên bản của trang dựa trên Content-Encodingtiêu đề. Bạn sẽ thấy stackoverflow.com/questions/1975416/...developers.google.com/speed/docs/best-practices/...
Ismael Miguel

2
@IsmaelMiguel nó sẽ thực sự nói với máy khách (và quan trọng hơn, bất kỳ máy chủ lưu trong bộ nhớ đệm nào đang hoạt động), rằng tệp khác nhau đối với từng biến thể của s giá trị tiêu đề yêu cầu Chấp nhận-Mã hóa của máy khách , thay vì từng Content-Encodingbiến thể của giá trị tiêu đề phản hồi máy chủ.
aularon

@ BlueRaja-DannyPflughoeft Bởi vì người dùng có nhiều danh tiếng và người dùng tìm kiếm danh tiếng xây dựng danh tiếng bằng cách săn lùng các câu hỏi để đóng. Bực bội vì nó thường dẫn đến những câu hỏi bị đóng lại mà không nên.
Dan Nissenbaum

Câu trả lời:


89

Tôi đoán điều đó có nghĩa là bạn bật tính năng nén gzip cho các tệp css và js của mình, vì điều đó sẽ cho phép máy khách nhận cả nội dung được mã hóa bằng gzip và nội dung thuần túy.

Đây là cách thực hiện trong apache2:

<IfModule mod_deflate.c>
    #The following line is enough for .js and .css
    AddOutputFilter DEFLATE js css

    #The following line also enables compression by file content type, for the following list of Content-Type:s
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml

    #The following lines are to avoid bugs with some browsers
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 
</IfModule>

Và đây là cách thêm Vary Accept-Encodingtiêu đề: [src]

<IfModule mod_headers.c>
  <FilesMatch "\.(js|css|xml|gz)$">
    Header append Vary: Accept-Encoding
  </FilesMatch>
</IfModule>

Các Vary:tiêu đề kể rằng nội dung phục vụ cho url này sẽ thay đổi tùy theo giá trị của một tiêu đề yêu cầu nhất định. Ở đây nó nói rằng nó sẽ cung cấp nội dung khác nhau cho những khách hàng nói rằng họ Accept-Encoding: gzip, deflate(một tiêu đề yêu cầu), so với nội dung được phân phát cho những khách hàng không gửi tiêu đề này. Ưu điểm chính của điều này, AFAIK, là cho các proxy bộ nhớ đệm trung gian biết rằng họ cần có hai phiên bản khác nhau của cùng một url vì sự thay đổi như vậy.


Tôi không nghĩ đây là nó. JS và CSS của tôi đã được nén. PageSpeed ​​vẫn đang phàn nàn.
StackOverflowNewbie

3
Tôi nghĩ rằng mod_deflate phải gửi tiêu đề Vary theo mặc định.
Matthew Flaschen

Tôi đã làm những gì bạn đã đề cập ở trên. Các tệp .js vẫn chưa được nén.
Andy N

@Andy; có thể máy chủ của bạn không có mô-đun "mod_deflate.c".
aularon

3
Apache 2.2 không yêu cầu phần mod_headers trong câu trả lời ở trên. mod_deflate đã làm những gì bạn cần. httpd.apache.org/docs/2.2/mod/mod_deflate.html
Ari Maniatis

4

Tôi e rằng Aularon đã không cung cấp đủ các bước để hoàn thành quy trình. Với một chút thử và sai, tôi đã có thể kích hoạt thành công Gzipping trên máy chủ WHM chuyên dụng của mình.

Dưới đây là các bước:

  • Chạy EasyApache trong WHM, chọn Deflate trong danh sách Exhaustive Options và xây dựng lại máy chủ.

  • Sau khi hoàn tất, hãy goto Cấu hình dịch vụ >> Cấu hình Apache >> Bao gồm Trình chỉnh sửa >> Đăng VirtualHost Bao gồm, chọn Tất cả các phiên bản, sau đó dán mã mod_headers.c và mod_headers.c (được liệt kê ở trên trong bài đăng của Aularon) lên đầu trang khác trong trường đầu vào.

  • Sau khi được lưu, tôi đã thấy mức tiết kiệm dữ liệu trung bình 75,36%! Bạn có thể chạy thử nghiệm trước và sau bằng cách sử dụng công cụ Nén HTTP này để xem kết quả của riêng bạn: http://www.whatsmyip.org/http_compression/

Hy vọng điều này làm việc cho tất cả các bạn!

  • Matt

3

Để giải nén các tệp phông chữ của bạn!

add "x-font/otf x-font/ttf x-font/eot"

như trong:

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml x-font/otf x-font/ttf x-font/eot

2

Nhiều giờ đã dành để làm rõ đó là gì. Vui lòng đọc bài đăng này để nhận .HTACCESSmã nâng cao và tìm hiểu những gì chúng làm.

Bạn có thể dùng:

Header append Vary "Accept-Encoding"
#or
Header set Vary "Accept-Encoding"

1

Điều này khiến tôi phát điên, nhưng có vẻ như phần chỉnh sửa của aularon đã thiếu dấu hai chấm sau đó "Vary". Vì vậy, thay đổi "Vary Accept-Encoding"để "Vary: Accept-Encoding"khắc phục sự cố cho tôi.

Tôi đã nhận xét bên dưới bài đăng, nhưng có vẻ như nó không cho phép tôi.

Nhưng dù sao, tôi hy vọng điều này sẽ cứu ai đó cùng rắc rối mà tôi đang gặp phải.


2
Bạn có chắc điều này tạo nên sự khác biệt? Trong tài liệu 2.2 không có ví dụ nào bao gồm dấu hai chấm: httpd.apache.org/docs/2.2/mod/mod_headers.html
Nic Cottrell

1

nếu ai đó cần cái này cho NGINXtệp cấu hình thì đây là đoạn mã:

location ~* \.(js|css|xml|gz)$ {
    add_header Vary "Accept-Encoding";
    (... other headers or rules ...)
}

0

Không cần chỉ định hoặc thậm chí kiểm tra xem tệp đã được nén hay chưa, bạn có thể gửi nó đến mọi tệp, Theo mọi yêu cầu.

Nó cho các proxy hạ nguồn biết cách khớp với các tiêu đề yêu cầu trong tương lai để quyết định xem liệu phản hồi đã lưu trong bộ nhớ cache có thể được sử dụng hay không thay vì yêu cầu một phản hồi mới từ máy chủ gốc.

<ifModule mod_headers.c>
  Header unset Vary
  Header set Vary "Accept-Encoding, X-HTTP-Method-Override, X-Forwarded-For, Remote-Address, X-Real-IP, X-Forwarded-Proto, X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Server"
</ifModule>
  • đó unsetlà sửa một số lỗi trong lưu trữ GoDaddy cũ hơn, tùy chọn.
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.