PHP ini file_get_contents внешний url

Я использую следующую функцию PHP:

file_get_contents('http://example.com');

Всякий раз, когда я делаю это на определенном сервере, результат пуст. Когда я делаю это где-нибудь еще, результат будет тем, чем может быть содержимое страницы. Когда я, однако, на сервере, где результат пуст, используйте функцию локально – без доступа к внешнему URL ( file_get_contents('../simple/internal/path.html'); ), он работает.

Теперь я уверен, что это имеет какое-то отношение к определенной конфигурации php.ini. Однако я не уверен, какой из них. Пожалуйста помоги.

Настройка, которую вы ищете, – allow_url_fopen .

У вас есть два способа обойти это без изменения php.ini, один из них – использовать fsockopen() , а другой – использовать cURL .

Я рекомендую использовать cURL поверх file_get_contents() любом случае, поскольку он был создан для этого.

Дополняя ответ Aillyn, вы можете использовать функцию, подобную приведенной ниже, для имитации поведения file_get_contents:

 function get_content($URL){ $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $URL); $data = curl_exec($ch); curl_close($ch); return $data; } echo get_content('http://example.com'); 

Это связано с настройкой конфигурации ini allow_url_fopen .

Вы должны знать, что включение этой опции может привести к некоторым ошибкам в вашем коде.

Например, этот отказ проверки ввода может стать полноценной уязвимостью удаленного выполнения кода:

 copy($_GET["file"], "."); 
 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($ch); curl_close($ch); 

лучше для http url, но как открыть https url help me

Это также даст внешним ссылкам абсолютный путь без использования php.ini

 <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($ch); curl_close($ch); $result = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#",'$1http://www.your_external_website.com/$2$3', $result); echo $result ?> 

Добавить:

 allow_url_fopen=1 

в файле php.ini . Если вы используете общий хостинг, сначала создайте его.

Ответы, приведенные выше, решают проблему, но не объясняют странное поведение, описанное ОП. Это объяснение должно помочь любому, кто тестирует связь между сайтами в среде разработки, где эти сайты все находятся на одном и том же хосте (и тот же virtualhost, я работаю с apache 2.4 и php7.0).

Есть тонкость с file_get_contents() я столкнулся, это абсолютно актуально здесь, но без внимания (возможно, потому, что он либо документирован, либо не документирован из того, что я могу сказать или задокументирован в неясной технической документации по безопасности PHP, которую я не могу найти).

С allow_url_fopen установлено значение « Off во всех соответствующих контекстах (например, /etc/php/7.0/apache2/php.ini , /etc/php/7.0/fpm/php.ini и т. Д.) И allow_url_fopen для параметра « On В команде (например, /etc/php/7.0/cli/php.ini ), вызовы file_get_contents() для локального ресурса будут разрешены, и никакое предупреждение не будет зарегистрировано, например:

 file_get_contents('php://input'); 

или

 // Path outside document root that webserver user agent has permission to read. eg for an apache2 webserver this user agent might be www-data so a file at /etc/php/7.0/filetoaccess would be successfully read if www-data had permission to read this file file_get_contents('<file path to file on local machine user agent can access>'); 

или

 // Relative path in same document root file_get_contents('data/filename.dat') 

В заключение, ограничение allow_url_fopen = Off аналогично правилу iptables в цепочке OUTPUT , где ограничение применяется только при попытке «выйти из системы» или «изменить контексты».

NB allow_url_fopen установлен в On в контексте командной строки (например, /etc/php/7.0/cli/php.ini ), что я имел в своей системе, но я подозреваю, что это не /etc/php/7.0/cli/php.ini бы на объяснение, которое я предоставил, даже если оно было установлено на Off если, конечно, вы не тестируете, запуская свои скрипты из самой командной строки. Я не тестировал поведение с allow_url_fopen в Off в контексте командной строки.