4 votes

Définition d'en-têtes de mise en cache différents pour des redirections différentes avec Apache mod_rewrite

J'ai un serveur virtuel Apache qui effectue un certain nombre d'opérations de réécriture (à l'aide de mod_rewrite) sur les URL demandées. Certains de ces appels RewriteRule redirigent le navigateur vers d'autres hôtes (à l'aide de redirections 301 et 302).

J'ai défini une expiration par défaut de 1 seconde dans ce fichier vhost :

ExpiresActive On
ExpiresDefault "access plus 1 second"

et par conséquent, toutes les redirections incluent cet en-tête :

Cache-Control: max-age=1

Ce que j'essaie de faire, c'est d'afficher un en-tête de mise en cache différent dans le cas d'une redirection particulière. Je veux que la plupart des redirections (les 302) continuent à avoir une expiration d'une seconde, mais pour l'une d'entre elles (une 301), j'aimerais utiliser une expiration d'un jour à la place.

Est-ce faisable ?

7voto

François Marier Points 381

Il existe un moyen de le faire, mais pas avec mod_expires. À la place, vous devez définir une variable d'environnement à l'aide de mod_rewrite, puis ajouter de manière conditionnelle les bons en-têtes de mise en cache à l'aide de mod_headers, comme décrit dans le document suivant Mark S. Kolich : Définir les en-têtes Cache-Control et Expires sur une redirection avec mod_rewrite .

Ma solution finale ressemble donc à ceci :

RewriteRule ... [last,redirect=301,env=longexpiry:1]
RewriteRule ... [last,redirect=302,env=nocache:1]

Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
Header always set Cache-Control "max-age=86400" env=longexpiry

Veillez cependant à ce que le mod_expires ne définisse pas une date d'expiration par défaut, sinon vous vous retrouverez avec des en-têtes en double.

1voto

Peter V. Mørch Points 732

En développant la réponse de @Francois Marier, j'avais besoin d'une règle de réécriture qui ressemble à ceci sans la redirection 30X :

RewriteRule ^version/[0-9a-z\-]*/(.*)$ /foo/$1 [E=versioncache:1]

Et comme je voulais utiliser versioncache dans un Header set la règle, elle doit l'être :

Header always set Cache-Control "max-age=86400" env=REWRITE_versioncache

Combien de temps penses-tu qu'il me faudra pour comprendre pourquoi l'évident ... env=versioncache n'a pas fonctionné ? Merci à cette réponse pour l'astuce d'apache qui précède REWRITE_ .

0voto

Thomas Sisson Points 492

Pour cela, vous devez créer un autre hôte virtuel avec des paramètres différents, et pour les redirections que vous souhaitez dans "cette situation", utilisez cet hôte virtuel. Ce n'est pas du code PHP, c'est du langage Apache. Désolé. Il n'y a pas de "si".

0voto

Sveatoslav Points 101

Vous pouvez essayer d'utiliser SetEnvIf d'Apache mod_setenvif . Quelque chose comme ceci (non testé) :

SetEnvIf Request_URI \.gif EXPIRES1DAY
Header set Cache-Control max-age=86400 env=EXPIRES1DAY

0voto

Eddie Points 11262

Une façon de résoudre ce problème sans supprimer l'expiration par défaut définie par le module mod_expires est d'ajouter une balise <Location> pour l'URL qui est redirigée. Disons que vous redirigez vers un dossier versionné et que vous modifiez périodiquement cette version :

RewriteRule ^/approot/(.*)  /approot.1.2.3.4/$1 [R=307,L]

Si vous ne voulez pas que cette redirection soit mise en cache (mais que vous voulez que le contenu soit mis en cache), ajoutez simplement ce bloc à votre configuration :

<Location /approot>
    ExpiresActive Off
</Location>

Bien sûr, " /approot "représente l'URL que vous redirigez.

Simple et facile. Vous n'avez pas besoin de modifier votre configuration mod_expires qui fonctionne déjà. Vous n'avez pas besoin d'essayer d'ajouter ou de supprimer des en-têtes avec mod_headers. Il suffit d'indiquer à mod_expires de ne pas ajouter ses en-têtes pour l'URL que vous redirigez.

J'ai d'abord essayé la réponse acceptée ci-dessus (par Francois Marier) mais cela n'a pas fonctionné car je ne voulais pas désactiver mon ExpiresDefault et de devoir ensuite reproduire une expiration dans de nombreuses zones différentes de la configuration à sa place.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X