PHP ini file_get_contents внешний URL

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

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

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

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


person arik    schedule 15.08.2010    source источник


Ответы (8)


Искомый параметр: allow_url_fopen.

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

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

person Aillyn    schedule 15.08.2010
comment
Это не совсем правильно. Вы можете использовать cURL с file_get_contents() с опцией конфигурации --with-curlwrappers. - person Artefacto; 15.08.2010
comment
@Artefacto Я не понимаю. Пожалуйста, дополните. - person Aillyn; 15.08.2010
comment
Если вы скомпилируете расширение curl с помощью --with-curlwrappers, curl будет использоваться для выполнения HTTP-запроса всякий раз, когда вы выполняете file_get_contents("http://example.com/stuff"). Я хотел сказать, что curl и file_get_contents не ортогональны, они не используют ни то, ни другое. - person Artefacto; 15.08.2010

В дополнение к ответу Эйлин вы можете использовать функцию, подобную приведенной ниже, чтобы имитировать поведение 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');
person Pablo    schedule 15.08.2010
comment
это потрясающе.. Я только что заменил все свои функции filt_get_content($url).... на get_content($url) и поместил вашу функцию в начало файла.. и ничего себе... все функции работают так гладко.. - person MFarooqi; 13.10.2020


$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);

лучше всего подходит для URL-адреса http, но как открыть URL-адрес https, помогите мне

person Vikash    schedule 28.02.2013

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

or

// 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>');

or

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

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

Н.Б. allow_url_fopen установлено в On в контексте командной строки (т. скрипты из самой командной строки. Я не тестировал поведение с allow_url_fopen установленным на Off в контексте командной строки.

person J-a-n-u-s    schedule 05.06.2017

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

Включить allow_url_fopen из cPanel или WHM в разделе PHP INI

person Sajibe Kanti    schedule 01.02.2021

Добавлять:

allow_url_fopen=1

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

person Cheap PC Shop    schedule 31.03.2012
comment
Вы также можете добавить некоторую справочную информацию, чтобы люди знали, почему, а не только что делать. - person Sgoettschkes; 27.10.2012