9
votes

Php supprimer http en-tête

quelque chose, je pense qu'Apache, ajoute ces en-têtes HTTP à toutes les réponses générées par des scripts PHP: xxx

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.

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?

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


0 commentaires

9 Réponses :


2
votes

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

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


3 commentaires

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



7
votes

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); xxx


5 commentaires

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.



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

0 commentaires

0
votes

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


2 commentaires

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



-1
votes

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


0 commentaires

0
votes

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.

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 recommandés de dire ("expire:"); pour remplacer l'ancienne en-tête, mais en-tête ("Cache-contrôle:"); vient de devenir cache-contrôle: max-Âge = 0 dans mon navigateur (ce n'est donc pas ce que vous essayez de faire).

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.

Je vérifierais expiresbytype expiresdefault Directives dans Global Configs, Vhosts, PR .HTAccess Files ou tout blocs encapsulés dans ou

"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)."

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


3 commentaires

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



3
votes

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>';
}


5 commentaires

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.


'' (vide) est apparemment la valeur correcte à utiliser avec session_cache_limiter , selon les documents.


M'a pris un moment pour le savoir, mais c'est vrai, si session.cache_limit est défini sur autre chose que '' , le contrôle de cache L'en-tête devient écrasé par PHP sur session_start .



0
votes

Si vos pages changent de ne pas souvent envisager d'utiliser des en-têtes Etag, comme celui-ci:

https://gist.github.com/oliworx/4951478

Ceci est utile, en particulier sur des connexions lentes (comme des téléphones mobiles).

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/


0 commentaires

1
votes

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.

Par exemple, si vous avez un système de panier et votre navigateur Caches / Ajouter? Produit = XYZ , il peut ne pas ajouter le produit à nouveau; Ce n'est probablement pas ce que vous voulez.

Cela dit, le paramètre par défaut peut être modifié en utilisant < Code> session_cache_limiter () avant session_start () ou définir le session.cache_limiter réglage de la configuration.


0 commentaires