2009-12-21 4 views
9

Quelque chose, je pense que Apache, ajoute ces en-têtes HTTP à toutes les réponses générées par des scripts PHP:PHP supprimer en-tête HTTP

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Cela fonctionne bien pour les pages dynamiques réelles, mais j'ai une page qui, tout généré par PHP, sont pour la plupart statiques, et je veux que le navigateur les cache.

Est-il possible en PHP de supprimer ces en-têtes de la réponse, et donc d'activer les règles de cache par défaut du navigateur, ou sinon y a-t-il une valeur que je puisse leur attribuer? Je préférerais ne pas définir mes propres valeurs, car je souhaite que le navigateur utilise les mêmes règles de mise en cache que pour les ressources statiques servies par Apache lui-même (sans utiliser mod_cache).

Répondre

2

D'abord je vérifierais si c'est vraiment pas un des manuscrits de php qui place ces en-têtes.

register_shutdown_function('foo'); 
echo "test"; 

function foo() { 
    flush(); 
    $c = "headers_list: \n " . join("\n ", headers_list()); 

    if (function_exists('apache_response_headers')) { 
    $c .= "\napache_response_headers:"; 
    foreach(apache_response_headers() as $k=>$v) { 
     $c.= "\n $k=$v"; 
    } 
    } 
    $c .= "\n\n"; 
    echo '<pre>', $c, '</pre>'; 
} 

Est-ce que cela imprime quelque chose de "utilisable" sur votre serveur?

+1

J'ai fait la recherche, et il semble que PHP définit les en-têtes lors de l'utilisation des fonctions de session. Il existe plusieurs façons de modifier la valeur des en-têtes, mais sans les empêcher d'être définis: –

+2

En fait, la définition de session.cache_limit sur "none" (valeur non documentée) a résolu le problème./questions/681115/cache-control-header-modifié-par-php-session –

+0

wow, je n'aurais pas pensé à ça depuis des lustres ;-) – VolkerK

2

Vous pouvez fournir manuellement des en-têtes HTTP à partir de PHP via la fonction header().

J'imagine que cela devrait désactiver les valeurs d'en-tête par défaut du serveur Web.

+0

Si je les mets à une chaîne vide, par ex. "Cache-Control:", les navigateurs vont-ils l'interpréter de la même manière que lorsqu'il est absent? –

+0

Êtes-vous sûr que PHP ne se contente pas d'ajouter les lignes d'en-tête, mais va générer un en-tête complètement nouveau? – dusoft

+0

Comportement par défaut est de remplacer les en-têtes existants avec le même nom, comme vu dans les docs pour header() –

7

Pour ces fichiers particuliers, vous pouvez ajouter des appels header() qui définissent ces en-têtes différemment. c'est à dire. header("Expires: " . $currentDatePlus10);

header("Cache-Control: max-age=3600, must-revalidate") 
+0

Si possible, je voudrais vraiment supprimer les en-têtes tout à fait, de sorte que le comportement du navigateur est exactement le même que pour les fichiers statiques normaux sur un serveur non configuré. –

+0

Puisqu'il se produit en dehors de l'environnement PHP, à moins de creuser dans Apache, écraser avec une autre valeur serait votre meilleur pari. Je vais couramment utiliser des dates d'expiration ridicules pour le contenu statique (lire 10 ans) pour garder le contenu en cache. – Myles

+1

Je suis préoccupé par le fait que si je le mets à une date 10 ans dans le futur, les modifications ne seront pas effectivement récupérées par les utilisateurs. –

1
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT"); 

ou un peu de temps tout aussi absurde dans un futur lointain. N'oubliez pas de définir vos valeurs d'en-tête avant toute sortie, sauf si vous effectuez une mise en mémoire tampon de sortie pour l'ensemble de votre page.

http://php.net/manual/en/function.header.php

0

suppress que du cache peut se faire comme suit: Code PHP:

header ("Cache-Control: no-cache, must-revalidate");// HTTP/1.1 
header ("Expires: Mon, 1 Jul 1990 05:00:00 GMT");// Date in the past 

si vous voulez générer automatiquement, vous voir ici: PHP: session_cache_limiter() - Manuel ils

+0

C'est exactement ce que j'essaie d'éviter –

+0

suis désolé mais vous n'avez pas accès aux rouleaux de cache du navigateur, donc vous devez utiliser http://at.php.net/manual/de/function.session-cache- expire.php – streetparade

-1

Je n'ai pas essayé ceci mais vous pourriez probablement enregistrer de telles pages en tant que dossiers de .html avec vos en-têtes faits sur commande ou manque de leur-de et le manuscrit pourrait courir dans le

0

Il y a probablement quelque part dans votre code qui a défini ces variables, car je ne peux pas trouver où elles sont insérées automatiquement par PHP n'importe où, ni dans aucune de mes installations LAMP.

Le seul en-tête généré automatiquement pour mes installations est X-Powered-By avec la version PHP.

Comme vous l'avez dit, des documents qu'ils recommandent dire header("Expires:"); pour remplacer l'ancien en-tête, mais header("Cache-control:"); est désormais Cache-Control: max-age=0 dans mon navigateur (si ce n'est pas ce que vous essayez de faire).

Je vous recommande de vérifier si ces valeurs proviennent d'un framework ou d'un paramètre que vous avez modifié, mais cela peut différer selon les versions de PHP/plates-formes sur lesquelles vous exécutez PHP.

Je voudrais vérifier ExpiresByType ou ExpiresDefault directives dans les configs globales, vhosts, pr.htaccess ou tous les blocs encapsulées dans <IfModule mod_expires> ou <IfModule mod_expires.c>

« Je veux que le navigateur à utiliser les mêmes règles de mise en cache que pour les ressources statiques qui sont desservis par Apache lui-même (sans utiliser mod_cache). » Essayez une recherche sur une ressource statique, puis faites correspondre les règles à ce moment-là. Vous pouvez calculer le hors d'Expires avec ceci ->http://www.php.net/manual/en/function.header.php#93377

+0

Je suis certain que les en-têtes ne sont pas définis depuis PHP. @ "Essayez de regarder une ressource statique puis de faire correspondre les règles.": C'est le point, ils n'ont pas ces en-têtes;) –

+0

laissez-moi vous simplifier la tâche, "Y at-il une valeur que je peux leur attribuer? c'est équivalent à leur absence?" pas vraiment. (Blanc) sera Interpretation d'une par chaque navigateur. « Je préférerais ne pas mettre mes propres valeurs » cela est impossible que vous ou votre hôte avez déjà quelque part. –

+0

Ok, j'étais certain que le Apparemment, ils sont définis par PHP lorsque vous utilisez ses sessions.Voir mon commentaire @VolkerK –

1

Ces en-têtes de cache sont envoyées lorsque vous commencez à utiliser des sessions et réglées sur « nocache » par défaut; Cela garantit que chaque requête donne des résultats cohérents. Par exemple, si vous avez un système de panier et que votre navigateur met en cache /add?product=xyz, il se peut qu'il ne puisse plus ajouter le produit; Ce n'est probablement pas ce que vous voulez.

Cela dit, le réglage par défaut peut être modifié soit en utilisant session_cache_limiter()avantsession_start() ou définissant le paramètre de configuration session.cache_limiter correspondante.