Используя стандартные функции Битрикса get_cookie и set_cookie, столкнулся с проблемой, что сохраняется только первое установленное значение (либо первые несколько), а потом перезапись куки умирает.
Проблема оказалась в том, что куки для основного домена .site.ru перезаписывается, а для домена .www.site.ru нет.
Сайт доступен в обоих вариантах, как с www, так и без. Сайтов в Битриксе 1 штука. В этом сайте прописан один домен. Домен прописан как site.ru. В настройках главного модуля стоит галка "Распространять куки на все домены". Ошибка воспроизводится именно в такой конфигурации с заходом на www.site.ru
Оперативный вариант избавиться сейчас от ошибки на ядре 15.0.6 состоит в изменении конфигурации: либо убираем галку "Распространять куки на все домены", либо удаляем все домены в настройках сайта. Но тут всплывут проблемы в виде уже установленных у пользователей кук на домены, которые могут перетирать устанавливаемые на новой конфигурации куки, и тогда некоторый функционал, связанный с куками, вообще перестает работать для таких пользователей.
Сама суть ошибки в том, что /bitrix/spread.php не выдает в заголовках куку для домена www.site.ru.
Поиск проблемы: 1. md5 в spread.php и передаваемый в параметре $_GET["k"] md5 не совпадают 2. т.к. соль $salt генерируется на стороне php, то проблема не в ней, а в переменной $cookie, которая передается в виде закодированной base64 строки 3. в самом запросе видим что-то типа /bitrix/spread.php?s=QklUU_тут_было_много_букв_BAg%253D%253D&k=af5a0ce9b001a018cb7a98fc26579cec Интересует нас неправильное окончание параметра s, %253D%253D 4. Поиски доков по функции base64_decode приводят на официальный сайт php: http://php.net/manual/ru/function.base64-encode.php Где в первом же комментарии видно, что есть вариации в виде base64url_encode для безопасной передачи таких параметров через url. 5. Далее идем патчить ядро: Ищем функцию GetSpreadCookieUrls() в файле /bitrix/modules/main/classes/general/main.php и в ней заменяем base64_encode на base64url_encode, предварительно записав функцию base64url_encode в /bitrix/php_interface/init.php 6. В файле /bitrix/modules/main/spread.php прописываем функцию base64url_decode и заменяем вызов base64_decode на base64url_decode 7. Проверяем, теперь проблемы нет и куки устанавливаются нормально!
Прошу поправить ошибку в ближайших апдейтах ядра, т.к. ошибка значительная, и подозреваю что в ядре она очень давно.
Копая еще глубже, оказалось что дело в кривой настройке редиректа в .htaccess Он там прописан как RewriteCond %{HTTP_HOST} ^site.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L] При этом в настройке сайта в битрикс прописан именно домен site.ru В такой ситуации запрос на http://site.ru/bitrix/spread.php редиректится на http://www.site.ru/bitrix/spread.php и мало того, что куки дублируются, так еще %3D в строке запроса заменяется на %253D. Проблема решается добавлением параметра NE или noescape в RewriteRule, чтобы было вот так RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L,NE] Либо просто сменой домена в настройках сайта на www.site.ru
Он там прописан как
RewriteCond %{HTTP_HOST} ^site.ru$ [NC]
RewriteRule ^(.*)$
При этом в настройке сайта в битрикс прописан именно домен site.ru
В такой ситуации запрос на
Проблема решается добавлением параметра NE или noescape в RewriteRule, чтобы было вот так
RewriteRule ^(.*)$
Либо просто сменой домена в настройках сайта на