如何使用浏览器缓存配置ETag

sam*_*sam 7 .htaccess etag caching browser-cache

.htaccess通过设置以下方式为静态站点设置了浏览器缓存:

# BROWER CACHING - 1 Day for images
<filesMatch ".(jpg|jpeg|gif|ico)$">
Header set Cache-Control "max-age=86400, public"
</filesMatch>
Run Code Online (Sandbox Code Playgroud)

我对这些具有1天缓存的图像很好,但网站经常更改,因此我不想缓存CSS和JS文件.

我读过ETag,据我所知,它允许你缓存一个文件,但也设置了它的创建日期,所以如果它在下次客户访问网站时得到更新,它将检查创建日期是否匹配.

  1. 我是否正确理解了ETag?
  2. 我该如何配置?我环顾四周,但找不到有关其配置的任何信息.

Pal*_*lec 7

HTTP 有几个与缓存相关的功能,它们适用于用户代理(浏览器)缓存和代理缓存(无论是否透明;例如客户端\xe2\x80\x99s 网络中的代理或位于服务器旁边的反向代理)。这些功能分为两组:过期(可能完全阻止请求)和验证(可能阻止数据传输)。

\n

实体标签( ETag) 只是这些特征之一,属于验证组。该组中的另一个是上次修改时间 ( Last-Modified)。实体标记允许由于内容更改而不是较新的上次修改时间而导致缓存失效。在维基百科上阅读有关实体标签如何工作的更多信息。简而言之,典型用法是:

\n
    \n
  1. 服务器将ETag标头添加到包含正在提供的资源的响应中。

    \n
  2. \n
  3. 客户端缓存资源并记住其实体标签( 的值ETag)。

    \n
  4. \n
  5. 下次客户端需要资源时,它会有条件地向服务器请求该资源。在请求中,它包括If-None-Match包含实体标签的标头。

    \n
  6. \n
  7. 如果资源发生了变化(If-None-Match服务器认为中的实体标签已过时),服务器会发送包含资源当前版本(和新实体标签)的响应,否则它只响应而不304 Not Modified发送又来资源了

    \n
  8. \n
\n

对于静态文件(不是在每次请求时由 CGI 脚本等动态创建的),Apache 可以配置为ETag通过FileETag指令生成。默认情况下,无需对配置进行任何更改,Apache 将生成文件ETag,其值将基于 Apache 2.4 中的文件\xe2\x80\x99s 的最后修改时间 (mtime) 和大小。在 Apache 2.3.14 中,默认值也用于包含 file\xe2\x80\x99s inode 号。

\n

如果文件是动态提供的,Apache 无法生成ETag,因为它不知道如何生成要缓存的资源的详细信息。由脚本来ETag适当设置并处理If-None-Match. 例如,在 mod_perl 中,If-None-Match可以使用Apache2::Request::meets_conditions来处理该部分,它通常实现对 HTTP/1.1 条件请求的处理。

\n

如果您想仅依赖 ETag,则必须禁用其他验证功能和过期机制。设置Cache-Control: max-age=0, must-revalidateExpires: 0强制重新验证缓存条目(即始终发出请求)。您还可以Last-Modified从响应中删除标头,但一般来说,HTTP/1.1 建议不要这样做

\n

有关Last-Modified和 的比较ETag,请参阅以下内容:

\n\n

请注意,这Last-Modified被视为 HTTP/1.0 兼容性功能ETag可能包含相同的值并且工作方式完全相同(除了使用If-None-Match代替If-Modified-Since)。

\n

作为旁注,我\xe2\x80\x99d 想补充一点,建议的标准RFC 7232存在,并且它与实体标签和条件请求的详细信息相关。请参阅其附录 A 了解它从 HTTP/1.1 引入的更改

\n


Ed-*_*pro 5

您可以使用FileETag MTime SizeHeader unset EtagFileEtag none。不要同时使用(创建ETag和删除ETag),而只能选择哪种服务器最适合您的特定服务器。

# Create the ETag (entity tag) response header field
FileETag MTime Size
Run Code Online (Sandbox Code Playgroud)

要么

# Remove the ETag (entity tag) response header field
Header unset ETag
FileETag none
Run Code Online (Sandbox Code Playgroud)


Mit*_*tin 2

ETAG 不是最重要的属性。您缺少的主要属性是过期。我百分百确定,浏览器缓存无需 etag 即可工作。检查http://pisrs.si上的以下配置。如何检查?在浏览器中按 F12,转到网络选项卡,查看如何获取资源,并与您的网站进行比较。本地主机资源以不同的方式缓存。检查您的浏览器信息。

以下是主域的工作配置,正在工作。确保您启用了必要的模组。

<IfModule mod_mime.c>
    AddType text/css .css
    AddType application/x-javascript .js
    AddType image/bmp .bmp
    AddType image/gif .gif
    AddType application/x-gzip .gz .gzip
    AddType image/x-icon .ico
    AddType image/jpeg .jpg .jpeg .jpe
    AddType image/png .png
    AddType application/x-font-ttf .ttf .ttc
    AddType application/zip .zip
</IfModule>
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css A31536000
    ExpiresByType application/x-javascript A31536000
    ExpiresByType application/javascript A31536000
    ExpiresByType text/javascript A31536000
    ExpiresByType text/x-js A31536000
    ExpiresByType image/bmp A31536000
    ExpiresByType image/gif A31536000
    ExpiresByType application/x-gzip A31536000
    ExpiresByType image/x-icon A31536000
    ExpiresByType image/jpeg A31536000
    ExpiresByType application/x-font-otf A31536000
    ExpiresByType image/png A31536000
    ExpiresByType application/x-font-ttf A31536000
    ExpiresByType application/zip A31536000
</IfModule>
<IfModule mod_deflate.c>
    <IfModule mod_headers.c>
        Header append Vary User-Agent env=!dont-vary
    </IfModule>
        AddOutputFilterByType DEFLATE text/html text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/plain image/x-icon image/png image/gif
    <IfModule mod_mime.c>
        # DEFLATE by extension
        AddOutputFilter DEFLATE js css htm html xml png gif
    </IfModule>
</IfModule>
<FilesMatch "\.(gif|ico|jpg|jpeg|png|GIF|ICO|JPG|JPEG|PNG|css|js|woff|CSS|JS|WOFF|ttf|TTF)$">
    <IfModule mod_headers.c>
         Header unset Set-Cookie
         Header set Cache-Control "max-age=31536000, public"
    </IfModule>
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)