2011-10-30 10 views
6

Ai fini della invalidazione di CDN, è necessario aggiungere un prefisso all'elemento di percorso dell'URL di un sito. Questo viene modificato ogni volta che viene rilasciata una nuova versione della risorsa.Aggiungere intestazioni a scadenza utilizzando Apache per percorsi che non esistono nel filesystem

L'URL viene quindi riscritto utilizzando mod_rewrite da: http://example.com/cdn/20111030/images/image.jpg a http://example.com/images/image.jpg che è il luogo in cui risiede effettivamente la risorsa.

Vorrei aggiungere intestazioni a scadenza lunga (almeno 3 mesi) alla risposta (per il primo URL che non esiste realmente nel filesystem). Qualcuno sa come fare questo?

+0

Cosa hai finora? –

+0

Ho avuto: http://pastebin.com/efc0UCD6 –

risposta

4

Da http://drupal.org/node/974350#comment-5305368
Queste regole sono per 480 settimane ma è possibile regolare l'ora di conseguenza.

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

vedere anche la AdvAgg rules come questi server maniglia che non hanno mod_headers o mod_expires installati. Usa una direttiva FilesMatch; i file advagg hanno un nome file univoco, quindi posso farlo. I fallback AdvAgg non funzionano in questo caso perché mod_expires non possono utilizzare variabili ambientali; né lo può FileETag. Da quello che posso vedere, mod_headers è il modo desiderato per impostare i tempi futuri in apache.

+0

Grazie, funziona benissimo. Su Apache 2.2 CDN non viene modificato in REDIRECT_CDN per me quindi ho dovuto cambiare REDIRECT_CDN in CDN. –

0

Una soluzione potrebbe essere quella di applicare la scadenza per tutte le attività, le mod_headers utilizzare per rimuovere le intestazioni dalla versione non cdn, ad esempio:

 
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 

E 'un po' eccessivo per la radice del sito web, ma se applicato solo alle risorse, sarebbe meno di un problema.

5

Sembra che se si aggiunge RewriteEngine/Rule nella configurazione di Apache per la propria soluzione, la posizione viene rilevata correttamente e serve le chiamate Expires/Cache-Control on/cdn e non le serve per non- cdn chiama, con un changee minore:

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

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

non riesco a vedere un motivo per cui questo dovrebbe essere un problema nella configurazione di Apache.

+0

Il problema con questo è che non è utilizzabile in .htaccess, che è il resto delle regole mod_rewrite. E se lasci il RewriteRule in .htaccess, nel momento in cui la richiesta raggiunge lo nel Vhost, ad esempio, il prefisso/cdn è già stato rimosso. –

+0

Perché entrambi non possono essere nella configurazione di apache? Questo risolve il problema. – Andy

+0

Puoi avere RewriteRules sia nella configurazione di apache che in .htaccess allo stesso tempo, e non entreranno in conflitto a meno che tu non glielo dica. – Andy

Problemi correlati