Почему дублируется query параметры в массиве $_SERVER?

Дублирование query параметров в массиве $_SERVER является нормальным и ожидаемым поведением в PHP. Это происходит потому, что веб-сервер, обрабатывая запросы, переносит информацию о query строке в разные переменные окружения, включая $_GET и $_SERVER.

Давайте рассмотрим пример для более подробного объяснения. Предположим, что у вас есть следующий URL: http://example.com?page=home&lang=en. В этом URL у нас есть два query параметра: page с значением home и lang с значением en.

Когда вы отправляете запрос по этому URL, веб-сервер анализирует его и создает массив $_GET, в котором сохраняются значения query параметров. В нашем примере, $_GET будет выглядеть так: ['page' => 'home', 'lang' => 'en'].

Однако, веб-сервер также передает информацию о query строке через массив $_SERVER. Для каждого параметра он создает свою переменную окружения, добавляя префикс "QUERY_" и преобразуя символы "-" (тире) в символы "_" (подчеркивания). Таким образом, в нашем примере, $_SERVER будет выглядеть примерно так:

[
    'QUERY_STRING' => 'page=home&lang=en',
    'HTTP_REFERER' => 'http://example.com',
    'REQUEST_URI' => '/',
    'REQUEST_METHOD' => 'GET',
    // другие переменные окружения
]

Вы можете получить доступ к значениям query параметров через $_SERVER['QUERY_STRING']. Например, в нашем примере $_SERVER['QUERY_STRING'] вернет строку 'page=home&lang=en'.

Таким образом, дублирование query параметров в массиве $_SERVER является результатом передачи информации о query строке из веб-сервера в PHP-скрипт через переменные окружения.