Добавьте заголовки истечения срока действия, используя Apache для путей, которые не существуют в файловой системе - PullRequest
6 голосов
/ 31 октября 2011

В целях аннулирования CDN мне нужно добавить префикс к элементу пути URL сайта. Это изменяется всякий раз, когда выпускается новая версия актива.

URL-адрес затем переписывается с использованием mod_rewrite от: http://example.com/cdn/20111030/images/image.jpg до http://example.com/images/image.jpg, где фактически находится актив.

Я хотел бы добавить к ответу заголовки с длительным сроком действия (не менее 3 месяцев) (для первого URL, который фактически не существует в файловой системе). Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

5 голосов
/ 05 ноября 2011

Похоже, что если вы добавите RewriteEngine / Rule в конфигурацию Apache для своего собственного решения, расположение будет правильно выбрано и будет обслуживать вызовы Expires / Cache-Control для / cdn, а не для них не для cdn.звонки с небольшим изменением:

    # in apache config
    RewriteEngine On
    RewriteRule ^/cdn/[^/]*/(.*) /$1 [L]

    <Location "/cdn">
      Header unset ETag
      FileETag None
      ExpiresActive on
      ExpiresDefault "access plus 1 year"
    </Location>

Я не вижу причины, по которой это должно быть проблемой в конфигурации Apache.

4 голосов
/ 01 декабря 2011

С 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.

0 голосов
/ 02 ноября 2011

Решением может быть применение Expires ко всем ресурсам, использование mod_headers для удаления заголовков из не-cdn версии, например:

 RewriteEngine on
 RewriteRule ^cdn/([0-9a-z])*/(.*) /$2 [L,E=cdn:1]

 ExpiresActive on
 ExpiresDefault "access plus 1 year"
 Header unset Expires env=!cdn
 Header unset Cache-Control env=!cdn

Это немного излишне для корня сайта, но если бы он применялся только к активам, это было бы не такой проблемой.

...