Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

379
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda