Je dois supprimer un en-tête de cookie de session déjà défini, mais je ne trouve aucun moyen de le faire.
~~Pourquoi ?
J'ai besoin de rendre une image, envoyée par un script PHP, cachable par l'utilisateur final ; cette image est utilisée pour suivre si une newsletter a été lue par le récepteur, donc si l'image est demandée, je sais que la newsletter a été lue. J'ai seulement besoin de savoir quand la newsletter est ouverte pour la première fois, les demandes suivantes peuvent être ignorées. Le problème est que, même si j'ai correctement défini les en-têtes Expire et Cache-Control, l'image est demandée chaque fois que l'utilisateur ouvre la newsletter - seule cette image est utilisée pour le suivi - essentiellement parce qu'elle n'est pas mise en cache par l'utilisateur. J'ai utilisé ceci outil pour comprendre pourquoi l'URL n'est pas cachable, et il dit que c'est à cause du cookie envoyé.~~
Ce que je veux éviter, c'est que l'utilisateur constate un retard dans le chargement de l'image de suivi.
Donc j'ai un session_start()
dans la fonction init de mon site web, que je ne veux pas supprimer, parce que le site web est grand et compliqué, et qu'il n'est pas souhaitable de faire un changement radical comme démarrer la session seulement si nécessaire (une des solutions que j'ai envisagées). Appeler session_start()
définit le Set-Cookie:
avec l'en-tête PHPSESSID
cookie, et je dois le supprimer. En lisant le header()
sur php.net, j'ai essayé de le définir avec une valeur vide comme ceci
header('Set-Cookie:');
header('Set-Cookie:', true);
header('Set-Cookie: ');
header('Set-Cookie: ', true);
avant et après un appel à session_write_close()
mais tout ce que j'ai obtenu, c'est que l'utilisateur reçoive un message d'erreur. Set-Cookie:
sans aucune valeur, exactement comme cela est écrit dans l'en-tête header
l'argument de la fonction.
Je dois dire que j'utilise toujours PHP 5.2, et que je ne peux donc pas utiliser la fonction header_remove()
que je vois dans le manuel, et lighttpd 1.4.24.
EDITAR: Il semble donc que l'outil que j'ai utilisé pour vérifier mes en-têtes ne soit pas si bon que ça. J'ai regardé les en-têtes avec curl --head
et a vu les en-têtes ci-dessous.
HTTP/1.1 200 OK
X-Powered-By: PHP/5.2.9
Set-Cookie: PHPSESSID=qn3ms55nvst2717e7b73qqu445; path=/
Last-Modified: Sun, 29 Mar 2009 21:53:36 GMT
ETag: "cb1dffff8c10db7b0a88794b1453cab8"
Expires: Sun, 20 Dec 2009 23:28:07 GMT
Cache-Control: private, max-age=2592000
Pragma: no-cache
Content-Type: image/png
Content-Length: 1322
Date: Fri, 20 Nov 2009 23:28:07 GMT
Server: lighttpd/1.4.24
Comme vous le voyez, il s'agit d'une Pragma: no-cache
. L'outil que j'ai utilisé disait que le Pragma
L'en-tête n'est pas utilisé, mais c'était une erreur. J'ai essayé de définir Pragma: cache
et le client de messagerie a mis l'image en cache.
J'ai fait une autre découverte, peut-être l'impossibilité de débloquer les Set-Cookie
est dû à lighttpd, puisque je ne peux pas supprimer l'en-tête Pragma
l'en-tête en utilisant header('Pragma:')
. J'attends avec impatience la version 5.3 de PHP. Est-ce que quelqu'un qui utilise Apache peut confirmer que l'énoncé ci-dessus header
L'appel supprime le Pragma
en-tête ?
Merci txyoji pour ce commentaire éclairant :-)
À ce stade, il semble que cette question ne soit là que pour confirmer que lighttpd ne peut pas supprimer les en-têtes en définissant un en-tête sans valeur.