php 7 getallheaders() проблема на ровном месте.

kursk3d

Новичок
Простая конструкция (версия php7)

$hdrs = getallheaders();

foreach ($hdrs as $header => $value) {
echo "$header: $value <br />\n";
}

if($hdrs['Host']){
echo "host: ".$hdrs['Host'];
}

var_dump($hdrs['Host']); // выдает NULL
хотя echo в foreach все отображает.

На OpenServer (php7) все работает.

Заливаю на свой хостинг $hdrs['Host']); // выдает NULL
меняю версию php на 5.6 все работает.

Это новые фокусы php 7 или настройки сервера.
ну соответственно и apache_request_headers() тоже самое.

Хочу получать заголовки и сравнивать их на корректность а не могу, как так?
 

Adelf

Administrator
Команда форума
Если ты хочешь узнать есть ли такой элемент в массиве не надо делать как ты. Надо либо isset($arr['key']) либо array_key_exists
 

kursk3d

Новичок
@Adelf,
дело не в том как я проверю ее наличие, а в том что ее нет хотя через foreach и echo она отображается.
а то что

var_dump(isset($hdrs['Host']));
выдаст false
вместо NULL
вопрос был не в этом.
 

Adelf

Administrator
Команда форума
А вывод вардампа напиши сюда тогда.
 

kursk3d

Новичок
@Adelf,
array(9) { ["Host"]=> string(28) "xn--80aap5ahhel3b7e.xn--p1ai" ["Connection"]=> string(10) "keep-alive" ["Cache-Control"]=> string(9) "max-age=0" ["Upgrade-Insecure-Requests"]=> string(1) "1" ["User-Agent"]=> string(113) "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" ["Accept"]=> string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" ["Accept-Encoding"]=> string(19) "gzip, deflate, sdch" ["Accept-Language"]=> string(35) "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4" ["Content-Length"]=> string(1) "0" }
 

kursk3d

Новичок
@Adelf, гениально. Я про тоже, встает вопрос! тех. поддержку мучать или спросить кто сталкивался с таким.
 

kursk3d

Новичок
@Вурдалак,
string(557) "a:9:{s:5:"Host";s:28:"xn--80aap5ahhel3b7e.xn--p1ai";s:11:"Connection";s:10:"keep-alive";s:14:"Cache-Control";s:9:"max-age=0";s:26:"Upgrade-Insecure-Requests";s:1:"1";s:11:"User-Agent";s:113:"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";s:7:"Accept";s:74:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";s:16:"Accept-Encoding";s:19:"gzip, deflate, sdch";s:16:"Accept-Language";s:35:"ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4";s:15:"Content-Length";s:1:"0";}"
bool(false)
 

Adelf

Administrator
Команда форума
s:5:"Host" !

Причем там все имена заголовков такие. Какой-то левый символ.
 

Adelf

Administrator
Команда форума
$s = array_keys($hdrs)[0];
for($i = 0; $i < strlen($s); $i++) print ord($s[$i]) . "\n";

Так.. ради интереса :)
 

kursk3d

Новичок
@Вурдалак, Если провести сериализацию и работать как со строкой то все можно выдернуть, ну хотелось бы обращаться как к массиву. а то получается костыль.
Любое обращение напрямую к элементу массива невозможно, такое ощущение что какой-то super private. Я в замешательстве.
 

Adelf

Administrator
Команда форума
строки с нулем в конце... :) привет из си... смешно однако :) А что за сервер?
 

kursk3d

Новичок
Решение:

function getRequestHeaders() {
$headers = array();
foreach($_SERVER as $key => $value) {
if (substr($key, 0, 5) <> 'HTTP_') {
continue;
}
$header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
$headers[$header] = $value;
}
return $headers;
}

$headers = getRequestHeaders();
 

kursk3d

Новичок
@Вурдалак, да получил доступ, а в чем хитрость, (первый раз вижу такую конструкцию) где почитать?
или хотя бы в пару словах.
 

Adelf

Administrator
Команда форума
PHP:
function getRequestHeaders() {
    $headers = array();
    foreach(getallheaders() as $key => $value) {
        $headers[trim($key)] = $value;
    }

    return $headers;
}
Упрощенный вариант. Но вообще странно... это веб-сервер так отправляет чтоли?
 

Вурдалак

Продвинутый новичок
@Вурдалак, да получил доступ, а в чем хитрость, (первый раз вижу такую конструкцию) где почитать?
или хотя бы в пару словах.
Там нулевой байт в конце каждого ключа. Когда ты выводишь это на экран, он просто не отображается. Вероятно, это вот этот баг: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755115
 
Сверху