Удалить дубликаты «Set-Cookie» заголовок из ответа PHP

Это пример сценария из более крупного приложения, но он показывает общий процесс того, что я пытаюсь сделать. Если у меня есть следующий скрипт:

<?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');

Я получаю следующий ответ (при просмотре через 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

Проблема в том, что Set-Cookie: test1… существует 3 разных раза, поэтому без необходимости увеличивать размер заголовка. (Опять же, это упрощенный пример —
на самом деле я имею дело с ~ 10 дубликатами файлов cookie в диапазоне ~ 800 байт.)

Есть ли что-нибудь, что я могу написать вместо TODO что бы избавиться от шапки либо полностью, либо так показывать только один раз? то есть следующая моя цель:

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

хотя Set-Cookie: test1=third не может существовать тоже, и это нормально, но Set-Cookie: test2=keep должен остаться. Когда я пытаюсь setcookie('test1', '', 1); чтобы удалить куки, он добавляет дополнительный заголовок, чтобы пометить его как просроченный:

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

И если я попытаюсь удалить заголовок, как:

if (!headers_sent()) {
foreach (headers_list() as $header) {
if (stripos($header, 'Set-Cookie: test1') !== false) {
header_remove('Set-Cookie');
}
}
}

это удаляет все Set-Cookie Заголовки, когда я только хочу test1 удален.

1

Решение

Как вы предложили в последнем блоке кода, headers_list () Функция может быть использована для проверки того, какие заголовки были отправлены. Используя это, последние значения для каждого куки могут быть сохранены в ассоциативном массиве. Имена и значения могут быть извлечены с помощью взорваться () (вместе с отделка()).

Если обнаружено несколько файлов cookie с одним и тем же именем, мы можем использовать header_remove () Позвоните, как вы, но затем установите куки на окончательные значения. Смотрите пример ниже, а также этот пример phpfiddle.

if (!headers_sent()) {
$cookiesSet = array(); //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, без кеша, без хранилища, обязательно повторная проверка
соединение поддержания активности
Content-Encoding GZIP
Тип содержимого текст / html; кодировка = UTF-8
Дата Ср, 26 апреля 2017 15:31:33 GMT
Истекает Ср, 11 января 1984 года 05:00:00 по Гринвичу
Pragma нет кэша
сервер Nginx
Set-Cookie test1 = третий
                     test2 = держать
Transfer-Encoding фрагментированный
изменяться Accept-Encoding

1

Другие решения

Я не понимаю, почему вы думаете, что код удаления cookie, который вы показали нам, удалил бы setcookie для test2.

Если ваш код устанавливает один и тот же файл cookie несколько раз, вам нужно изменить код, чтобы он прекратил устанавливать файл cookie несколько раз! Все остальное — неаккуратный обходной путь.

0

По вопросам рекламы [email protected]