Este es un script de ejemplo de una aplicación más grande, pero muestra el proceso general de lo que estoy tratando de hacer. Si tengo el siguiente script:
<?php ob_start(); setcookie('test1', 'first'); setcookie('test1', 'second'); setcookie('test1', 'third'); setcookie('test2', 'keep'); //TODO remove duplicate test1 from headers ob_end_clean(); die('end test');Recibo la siguiente respuesta (como se ve a través de Fiddler):
HTTP/1.1 200 OK Date: Tue, 25 Apr 2017 21:54:45 GMT Server: Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.5.30 X-Powered-By: PHP/5.5.30 Set-Cookie: test1=first Set-Cookie: test1=second Set-Cookie: test1=third Set-Cookie: test2=keep Content-Length: 8 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html end test El problema es que Set-Cookie: test1 ... existe 3 veces diferentes, por lo tanto, aumenta el tamaño del encabezado innecesariamente. (Nuevamente, este es un ejemplo simplificado; en realidad, estoy tratando con ~ 10 cookies duplicadas en el rango de ~ 800 bytes).
¿Hay algo que pueda escribir en lugar de TODO que elimine el encabezado por completo o que solo se muestre una vez? es decir, el siguiente es mi objetivo final:
HTTP/1.1 200 OK Date: Tue, 25 Apr 2017 21:54:45 GMT Server: Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.5.30 X-Powered-By: PHP/5.5.30 Set-Cookie: test1=third Set-Cookie: test2=keep Content-Length: 8 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html end test aunque Set-Cookie: test1=third tampoco podría existir y eso está bien, pero Set-Cookie: test2=keep debe permanecer. Cuando intento setcookie('test1', '', 1); para eliminar la cookie, agrega un encabezado adicional para marcarla como caducada:
Set-Cookie: test1=first Set-Cookie: test1=second Set-Cookie: test1=third Set-Cookie: test2=keep Set-Cookie: test1=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0Y si trato de eliminar el encabezado como:
if (!headers_sent()) { foreach (headers_list() as $header) { if (stripos($header, 'Set-Cookie: test1') !== false) { header_remove('Set-Cookie'); } } } elimina todos los encabezados Set-Cookie cuando solo quiero que se elimine test1 .
Como sugirió en ese último bloque de código, la función headers_list() podría usarse para verificar qué encabezados se han enviado. Usando eso, los últimos valores para cada cookie podrían almacenarse en una matriz asociativa. Los nombres y valores se pueden extraer usando explode() (junto con trim() ).
Cuando se han detectado varias cookies con el mismo nombre, podemos usar la llamada header_remove() como lo hizo, pero luego establecer las cookies en los valores finales. Vea el ejemplo a continuación, así como este ejemplo phpfiddle .
if (!headers_sent()) { $cookiesSet = []; //associative array to store the last value for each cookie $rectifyCookies = false; //multiple values detected for same cookie name foreach (headers_list() as $header) { if (stripos($header, 'Set-Cookie:') !== false) { list($setCookie, $cookieValue) = explode(':', $header); list($cookieName, $cookieValue) = explode('=', trim($cookieValue)); if (array_key_exists($cookieName, $cookiesSet)) { $rectifyCookies = true; } $cookiesSet[$cookieName] = $cookieValue; } } if ($rectifyCookies) { header_remove('Set-Cookie'); foreach($cookiesSet as $cookieName => $cookieValue) { //might need to consider optional 3rd - 8th parameters setcookie($cookieName, $cookieValue); } } }Cache-Control max-age=0, no-cache, no-store, must-revalidate
Mantener viva la conexión
Gzip de codificación de contenido
Tipo de contenido texto/html; conjunto de caracteres = utf-8
Fecha miércoles, 26 de abril de 2017 15:31:33 GMT
Vence el miércoles 11 de enero de 1984 a las 05:00:00 GMT
Pragma sin caché
Servidor nginx
Set-Cookie test1=tercero
test2=mantener
Codificación de transferencia fragmentada
Variar codificación de aceptación
No entiendo por qué cree que el código de eliminación de cookies que nos mostró eliminaría setcookie para test2.
Si su código está configurando la misma cookie varias veces, entonces debe cambiar su código para que deje de configurar la cookie varias veces. Cualquier otra cosa es una solución descuidada.