2010-05-11 1 views
3

Ce que je faisPHP ne pas obéir à mes ETags définies

Je tire une image de la base de données et l'envoyer au navigateur avec tous les en-têtes appropriés - l'image affiche bien. J'envoie également un en-tête ETag, en utilisant le SHA1 du contenu de l'image comme balise.

Les images sont appelées semi-régulières, donc la mise en cache est un peu un problème (ne pas tuer le site, mais agréable à avoir).

Le problème

$ _SERVER [ 'HTTP_IF_NONE_MATCH'] n'est pas disponible pour moi. Pour autant que je sache, c'est à cause du style de vie de PHP "désobéir aux contrôles de cache". Je ne peux pas jouer avec le limiteur de cache de session, parce que je n'ai pas accès. Mais, même si j'avais accès, je ne voudrais pas le toucher: 99% du site est sous WordPress.

L'environnement

  • PHP 4 (ne demandez pas)
  • Apache 2.2
  • WordPress
  • Les images en direct dans la base de données (largeblog), que je ne peux pas changer .

Des conseils, des astuces, etc. seraient utiles. Je n'ai pas beaucoup de place pour changer les choses environnementales/structurelles.

Cheers.

Répondre

2

Avez-vous essayé de lire HTTP_IF_NONE_MATCH de apache_request_headers()?

Si vous exécutez PHP antérieur à la version 4.3, il s'appelait auparavant getallheaders().


Modifier Je vois maintenant, dans la page I LIÉ, que vous pouvez également essayer de mettre

RewriteEngine on 
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}] 
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}] 

dans le fichier .htaccess approprié pour forcer Apache à définir le PHP $ _SERVER [...] variables que vous essayez sans succès de lire.

0

Si PHP ne reçoit pas l'en-tête de correspondance If-None-Match, vous ne pouvez pas faire grand-chose. Je ne sais pas ce que vous voulez dire par "PHP" désobéir les contrôles de cache ""; PHP génère une dynamique arbitraire à la volée, il ne peut, a priori, savoir si ce qu'il doit retourner est mis en cache par le client ou non.

Quoi qu'il en soit, vous devez vérifier si le client envoie effectivement l'en-tête. Si c'est le cas, mais qu'il n'atteint pas PHP, vérifiez s'il atteint Apache. S'il est atteint PHP mais pas Apache, vous pouvez toujours pirater une solution mod-rewrite, comme l'ajout de l'en-tête sous forme de chaîne de requête (non testé!):

RewriteCond %{HTTP_IF_NONE_MATCH} (.+) 
RewriteRule ^/get_image.php /get_image.php?if-none-match=%1 [B,QSA] 
Questions connexes