quelque chose, je pense qu'Apache, ajoute ces en-têtes HTTP à toutes les réponses générées par des scripts PHP: Ceci fonctionne correctement pour les pages dynamiques réelles, mais j'ai une page qui, tout en généré par Php, sont principalement statiques, et je veux que le navigateur se cache. P> existe un moyen de supprimer les en-têtes de la réponse et activez ainsi les règles de mise en cache par défaut du navigateur, ou sinon, Il y a une valeur que je peux les définir à cela équivalent avec eux étant absent? P> 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 desservies par Apache lui-même (sans utiliser mod_cache). P> p>
9 Réponses :
Vous pouvez fournir manuellement des en-têtes HTTP de PHP via la Header ( ) code>
fonction. p>
J'imagine que cela devrait désactiver les valeurs d'en-tête par défaut du serveur Web. P>
Si je les ai mis sur une chaîne vide, par exemple "Cache-Control:", les navigateurs interpréteront-ils cela de la même manière que lorsqu'il est absent?
Êtes-vous sûr que PHP ne consiste pas simplement à ajouter les lignes d'en-tête, mais générera complètement une nouvelle en-tête?
Le comportement par défaut consiste à remplacer les en-têtes existants avec le même nom, comme indiqué dans la documentation de l'en-tête ()
Pour ces fichiers particuliers, vous pouvez ajouter des appels d'en-tête () qui définissent ces en-têtes différemment. c'est à dire. en-tête ("Expire:". $ CourentdatePlus10); code>
Si possible, j'aimerais vraiment supprimer les en-têtes, de sorte que le comportement du navigateur est exactement le même que pour les fichiers statiques normaux sur un serveur non configuré.
Étant donné que cela se produit à l'extérieur de l'environnement PHP, à court de creuser dans Apache, écrasement avec une autre valeur serait votre meilleur choix. Je vais généralement utiliser des dates d'expiration ridicule pour le contenu statique (lire 10 ans) pour garder le contenu mis en cache.
Je crains que si je le fixe à une date de 10 ans à l'avenir, des modifications ne seront effectivement pas ramassées par les utilisateurs.
"La mise en cache est facile; l'expiration est difficile"
Ce qui est souvent fait, c'est d'inclure une version de fichier dans le nom de fichier et de modifier les références à cela lorsque la version du fichier change. (assez facile si vous utilisez déjà PHP). Quelque chose comme Site.css? V = 2.3 ou Site-2.3.css et modifier les numéros de version afin que les navigateurs se rétablissent.
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT"); or some equally absurd time in the distant future. Remember to set your header values before any output has been sent, unless you're doing output buffering for your entire page.http://php.net/manual/en/function.header.php
Supprimer celui du cache peut être effectué 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
C'est exactement ce que j'essaie d'empêcher
Je suis désolé mais vous n'avez pas accès au barrage de cache de navigateur afin que vous devez utiliser at.php.net/manual/de/function.session-cache-expire.php
Je n'ai pas essayé cela, mais vous pouvez probablement sauvegarder de telles pages que des fichiers .html avec vos en-têtes personnalisés ou un manque de leur et le script pourrait courir à l'intérieur de la p>
Il y a probablement quelque part dans votre code qui a défini ces variables, car je ne trouve pas où ils sont insérés automatiquement par PHP n'importe où, ni dans aucune des installations de lampe. P>
Le seul en-tête généré automatiquement pour mes installations est Comme vous l'avez dit, des documents recommandés de dire Je recommanderais de vérifier si ces valeurs proviennent d'un cadre ou d'un paramètre que vous avez changé, mais cela peut être différent sur différentes versions de php / plates-formes que vous exécuteriez PHP sur. P>
Je vérifierais "Je veux que le navigateur utilise les mêmes règles de mise en cache que pour les ressources statiques desservies par Apache lui-même (sans utiliser mod_cache)." P>
Essayez d'examiner une ressource statique, puis de correspondre aux règles alors. Vous pouvez calculer l'expiration offest avec ceci -> http: // www. php.net/manual/fr/function.header.php#93377 p> X-Powered-by code> avec la version PHP. P>
("expire:"); code> pour remplacer l'ancienne en-tête, mais
en-tête ("Cache-contrôle:"); code> vient de devenir
cache-contrôle: max-Âge = 0 code> dans mon navigateur (ce n'est donc pas ce que vous essayez de faire). P>
expiresbytype ou
expiresdefault code> Directives dans Global Configs, Vhosts, PR .HTAccess Files ou tout blocs encapsulés dans
Je suis certain que les en-têtes ne sont pas allés à partir de 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;)
Permettez-moi de rendre cela plus simple pour vous », est-ce qu'il y a une valeur que je peux les définir à cela équivalent à ceux qui leur sont absents?» pas vraiment. (vide) sera interpiré par chaque navigateur. "Je préférerais ne pas définir mes propres valeurs" Cela est impossible que vous ou votre hôte avez déjà quelque part.
Ok, j'étais certain que les en-têtes n'étaient pas définis par mon code. Apparemment, ils sont définis par PHP lorsque vous utilisez ses sessions. Voir mon commentaire @volkerk
Tout d'abord, je vérifierais si ce n'est vraiment pas l'un des scripts PHP qui définit 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>'; }
J'ai fait la recherche et il semble que PHP définit les en-têtes lors de l'utilisation des fonctions de session. J'ai regardé autour des documents pertinents. Il existe des moyens de modifier la valeur des en-têtes, mais ne les empêchent pas d'être définie.
En réalité, régler la session.Cache_limit sur "Aucun" (valeur non documentée) résolvée. Voir Stackoverflow.com/Questions/ 681115 / ...
Ouais, je me demande que PHP Dev a décidé que ce serait un bon endroit pour le mettre.
'' code> (vide) est apparemment la valeur correcte à utiliser avec
session_cache_limiter code>, selon les documents.
M'a pris un moment pour le savoir, mais c'est vrai, si session.cache_limit code> est défini sur autre chose que
'' code>, le contrôle de cache code > L'en-tête devient écrasé i> par PHP sur
session_start code>.
Si vos pages changent de ne pas souvent envisager d'utiliser des en-têtes Etag, comme celui-ci: P>
https://gist.github.com/oliworx/4951478 p>
Ceci est utile, en particulier sur des connexions lentes (comme des téléphones mobiles). P>
indice: vous devez toujours vérifier, ce que le navigateur est vraiment chargé, avec les en-têtes HTTP en direct Firefox: https://addons.mozilla.org/de/firefox/addon/live-http-headers/ P>
Ces en-têtes de cache sont envoyés lorsque vous commencez à utiliser des sessions et défini sur "Nocache" par défaut; Cela garantit que chaque demande donne des résultats cohérents. P>
Par exemple, si vous avez un système de panier et votre navigateur Caches Cela dit, le paramètre par défaut peut être modifié en utilisant < Code> session_cache_limiter () code> avant em> / Ajouter? Produit = XYZ code>, il peut ne pas ajouter le produit à nouveau; Ce n'est probablement pas ce que vous voulez. P>
session_start () code> ou définir le
session.cache_limiter code>
réglage de la configuration. P>