6

出于 CDN 失效的目的,我需要在站点 URL 的路径元素中添加一个前缀。每当发布资产的新版本时,都会更改此设置。

然后使用 mod_rewrite 从http://example.com/cdn/20111030/images/image.jpghttp://example.com/images/image.jpg重写 URL,这是资产实际所在的位置。

我想在响应中添加长过期标头(至少 3 个月)(对于文件系统中实际上不存在的第一个 URL)。有谁知道如何做到这一点?

4

3 回答 3

5

看来,如果您在 Apache 配置中为您自己的解决方案添加 RewriteEngine/Rule,则位置会被正确拾取并在 /cdn 调用上为 Expires/Cache-Control 提供服务,并且不为非 CDN 调用提供服务,与一个小改动:

    # 在 Apache 配置中
    重写引擎开启
    重写规则 ^/cdn/[^/]*/(.*) /$1 [L]

    <位置“/cdn”>
      标头未设置 ETag
      FileETag 无
      过期活动于
      ExpiresDefault "访问加 1 年"
    </位置>

我看不出这应该是 Apache 配置中的问题的原因。

于 2011-11-05T14:05:30.010 回答
4

来自http://drupal.org/node/974350#comment-5305368
这些规则适用于 480 周,但您可以相应地调整时间。

<IfModule mod_rewrite.c>
  RewriteEngine on
  <IfModule mod_headers.c>
    # Transform /cdn/***/ to /
    RewriteCond %{REQUEST_URI} ^/cdn/([0-9a-zA-Z])*/(.+)$
    RewriteRule .* /%2 [L,E=CDN:1]
    # Apache will change CDN to REDIRECT_CDN.

    # Set a far future Cache-Control header (480 weeks), which prevents
    # intermediate caches from transforming the data and allows any
    # intermediate cache to cache it, since it's marked as a public resource.
    Header set Cache-Control "max-age=290304000, no-transform, public" env=REDIRECT_CDN

    # Set a far future Expires header. The maximum UNIX timestamp is somewhere
    # in 2038. Set it to a date in 2037, just to be safe.
    Header set Expires "Tue, 20 Jan 2037 04:20:42 GMT" env=REDIRECT_CDN

    # Pretend the file was last modified a long time ago in the past, this will
    # prevent browsers that don't support Cache-Control nor Expires headers to
    # still request a new version too soon (these browsers calculate a
    # heuristic to determine when to request a new version, based on the last
    # time the resource has been modified).
    # Also see http://code.google.com/speed/page-speed/docs/caching.html.
    Header set Last-Modified "Wed, 20 Jan 1988 04:20:42 GMT" env=REDIRECT_CDN

    # Do not use etags for cache validation.
    Header unset ETag env=REDIRECT_CDN
  </IfModule>
</IfModule>

另请参阅AdvAgg 规则,因为这些处理未安装 mod_headers 或 mod_expires 的服务器。它使用 FilesMatch 指令;advagg 文件有一个相当独特的文件名,因此我可以这样做。AdvAgg 回退在这种情况下不起作用,因为mod_expires不能使用环境变量;FileETag也不能。据我所见,mod_headers是在 apache 中设置遥远未来时间的理想方式。

于 2011-12-01T11:13:17.623 回答
0

一个解决方案可能是将 Expires 应用于所有资产,使用 mod_headers 从非 CDN 版本中删除标头,例如:

重写引擎开启
 重写规则 ^cdn/([0-9a-z])*/(.*) /$2 [L,E=cdn:1]

 过期活动于
 ExpiresDefault "访问加 1 年"
 标头未设置过期 env=!cdn
 标头未设置 Cache-Control env=!cdn

对于网站的根目录来说这有点矫枉过正,但如果只应用于资产,问题就不大了。

于 2011-11-01T23:07:51.573 回答