Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

377
Views
Eliminar el encabezado "Set-Cookie" duplicado de la respuesta de PHP

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=0

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

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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

Producción:

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

about 4 years ago · Santiago Trujillo Report

0

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.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!