Проблема была в заголовке Content-Encoding
, точнее, в методе сжатия. Сервер автоматически сжал ответ, используя алгоритм Бротли, и вернул заголовок Content-Encoding: br
.
Я пришел к выводу, что сервер Telegram ожидает ответа со сжатием gzip. У меня не было возможности настроить алгоритм сжатия на сервере, поэтому мне пришлось сжимать ответ вручную:
function compress($data) {
$supportsGzip = strpos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) !== false;
if ( $supportsGzip ) {
$content = gzencode( trim( preg_replace( '/\s+/', ' ', $data ) ), 9);
header('Content-Encoding: gzip');
} else {
$content = $data;
}
$offset = 60 * 60;
$expire = "expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header("content-type: text/html; charset: UTF-8");
header("cache-control: must-revalidate");
header( $expire );
header( 'Content-Length: ' . strlen( $content ) );
header('Vary: Accept-Encoding');
echo $content;
}
compress(""); //Compress an empty answer in gzip
После этого обновления они стали приходить в единственном экземпляре.
PS Это относится к формату text/html
. Если webhook должен вернуть application/json
, то все работает без сжатия.