Подтвердить что ты не робот

PHP ini file_get_contents внешний url

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Дополняя ответ 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');

Ответ 3

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

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

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

copy($_GET["file"], "."); 

Ответ 4

$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

Ответ 5

Это также даст внешним ссылкам абсолютный путь без использования 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
?>

Ответ 6

Добавить

allow_url_fopen=1

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

Ответ 7

Ответы, приведенные выше, решают проблему, но не объясняют странное поведение, описанное ОП. Это объяснение должно помочь любому, кто тестирует связь между сайтами в среде разработки, где эти сайты все находятся на одном и том же хосте (и тот же виртуальный хост, я работаю с 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. e.g. 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, где ограничение применяется только при попытке "выйти из системы" или "изменить контексты".

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