6

CDNを無効にするために、サイトのURLのパス要素にプレフィックスを追加する必要があります。これは、アセットの新しいバージョンがリリースされるたびに変更されます。

次に、mod_rewriteを使用してURLをhttp://example.com/cdn/20111030/images/image.jpgからhttp://example.com/images/image.jpgに書き換えます。これは、アセットが実際に存在する場所です。

応答に長い有効期限ヘッダー(少なくとも3か月)を追加したいと思います(ファイルシステムに実際には存在しない最初のURLの場合)。誰かがこれを行う方法を知っていますか?

4

3 に答える 3

5

独自のソリューションのApache構成にRewriteEngine/Ruleを追加すると、場所が正しく取得され、/cdn呼び出しでExpires/ Cache-Controlを提供し、非cdn呼び出しでは提供されないようです。マイナーチェンジ:

    #apache構成内
    RewriteEngineオン
    RewriteRule ^ / cdn / [^ /] * /(。*)/ $ 1 [L]

    <場所"/cdn">
      ヘッダーの未設定のETag
      FileETagなし
      ExpiresActive on
      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>

これらは mod_headers または mod_expires がインストールされていないサーバーを処理するため、 AdvAgg ルールも参照してください。FilesMatch ディレクティブを使用します。advagg ファイルにはかなり一意のファイル名が付けられているため、これを行うことができます。この場合、mod_expires は環境変数を使用できないため、AdvAgg フォールバック機能しません。FileETagもできません。私が見る限り、mod_headersは apache で遠い将来の時間を設定する望ましい方法です。

于 2011-12-01T11:13:17.623 に答える
0

解決策は、Expires をすべてのアセットに適用し、mod_headers を使用して非 cdn バージョンからヘッダーを削除することです。たとえば、次のようになります。

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

 有効期限有効
 ExpiresDefault「アクセスプラス1年」
 ヘッダーの設定解除 期限切れ env=!cdn
 ヘッダー unset Cache-Control env=!cdn

Web サイトのルートには少しやり過ぎですが、アセットにのみ適用する場合はそれほど問題にはなりません。

于 2011-11-01T23:07:51.573 に答える