У нас есть 2 сервера, dev и live. Они оба используют LAMP (Debian), но dev-сервер является обычным http, а live-сервер - https. Этот код работает отлично на нашем Dev сервере:file_get_contents + stream_context_create работает на 1 сервере, заблокирован на другом
$all_data = array(...);
$eol = "\r\n";
$headers = array(
'Content-Type: application/json',
'Content-Length: ' . strlen(json_encode($all_data)),
'connection: close'
);
$headers = implode($eol, $headers);
$opts = array(
'http'=>array(
'method' => 'POST',
'header' => $headers,
'content' => json_encode($all_data)
)
);
$context = stream_context_create($opts);
$update_data = file_get_contents($_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $system_file, null, $context);
На живом сервере, то file_get_contents дает эту ошибку:
Warning: file_get_contents(https://...): failed to open stream: Connection timed out in ....php on line 1086
Я смотрел на журналы апача подсказки относительно того, что является причиной его сбой на реальном сервере, но я вижу только ошибку выше. Он не говорит, что блокирует вызов. У меня allow_url_include и allow_url_fopen установлено значение On на реальном сервере.
Я не знаю, что-то в конфигурации Apache или в конфигурации SSL или что-то еще, и я не знаю, где искать. Сегодня я провел несколько часов, исследуя эту проблему, и попытался добавить разные заголовки в массив заголовков (User-Agent, Accept-Language, Accept-Encoding, Cookie и т. Д.), Но ничего не получилось. Я в основном пытался воспроизвести то, что было на dev, но жить просто не понравилось.
Я также подтвердил, что если я скопирую и вставляю URL-адрес, который создается непосредственно в браузере, он работает, поэтому я знаю, что имя файла верное.
dev server:
php: 5.6.14-0+deb8u1
apache: Apache/2.4.10
debian: 8.2
live server:
php: 5.5.12
apache: Apache/2.4.10
debian: 7.9
Тайм-аут соединения звучит как вопрос брандмауэра. Вы пинговали пункт назначения с живого сервера или лучше запускали nmap на порту 443? –
Попробуйте сделать запрос https вручную из командной строки через 'curl' на сервере, где он не работает. Просто: 'curl https: // ...' – Will
@JeffPuckettII, я пробовал это: nmap -p 443 ourdomain.com и получил следующее: ПОРТОВАЯ ГОСУДАРСТВЕННАЯ СЛУЖБА 443/tcp отфильтрована https – raphael75