file_get_contents не работает на производственном сервере, отлично работает на локальном

У меня есть PHP-скрипт, который извлекает изображение с удаленного сервера, чтобы я мог манипулировать им с помощью HTML5 canvas API.

<?php if ((isset($_GET['url']))) { $url = $_GET['url']; $file_format = pathinfo($url, PATHINFO_EXTENSION); try { header("Content-Type: image/$file_format"); header("Content-disposition: filename=image.$file_format"); $img = file_get_contents($url); echo $img; } catch(Exception $e) { echo $e->getMessage(); } } else die('Unknown request'); ?> 

Типичный запрос будет выглядеть так:

 fetch_image.php?url=http://example.com/images/image.png 

Все работает нормально на моем локальном сервере, но производственный сервер дает мне эту ошибку:

NetworkError: 500 Внутренняя ошибка сервера.

Журнал ошибок регистрирует это сообщение:

PHP Предупреждение. Невозможно изменить информацию заголовка – уже отправленные заголовки.

Я пробовал некоторые из предложений, но не работал:

 allow_url_fopen = 1 

Убедитесь, что сервер позволяет открывать удаленные URL-адреса с файловыми функциями (настройка php.ini allow_url_fopen должна быть «истина»).

Пытаться

 ob_start() 

в начале и в

 ob_end_flush() 

в конце скрипта. Также убедитесь, что сценарий не содержит символов перед <?php .

Вы должны убедиться, что ваш хостинг-провайдер не отключил удаленный выбор URL из соображений безопасности. Параметр allow_url_fopen и вы можете проверить текущую конфигурацию с помощью phpinfo () . В таком случае file_get_contents () должен возвращать FALSE поэтому вы должны проверить $img на false с оператором === .

Попробуйте этот путь

 <?php if ((isset($_GET['url']))) { $url = $_GET['url']; $file_format = pathinfo($url, PATHINFO_EXTENSION); try { ob_clean(); ob_start(); header("Content-Type: image/$file_format"); header("Content-disposition: filename=image.$file_format"); $img = file_get_contents(urlencode($url)); // as per manual "If you're opening a URI with special characters, such as spaces, you need to encode the URI with urlencode(). " echo $img; echo ob_get_clean(); exit(); } catch(Exception $e) { echo $e->getMessage(); } } else die('Unknown request'); ?> 

еще одно решение из руководства

Иногда вы можете получить сообщение об ошибке с URL-адресом http. даже если вы установили «allow_url_fopen = On» в php.ini

Для меня решение было также установить «user_agent» на что-то.

Заголовки отправляются при запуске вывода содержимого. Итак, где-то перед кодом, который вы поставили выше, контент получает эхо (от PHP или простой HTML или javascript). Вам нужно выследить, где это происходит.

  1. вы должны проверить кодировку файла, так как utf8 будет разбивать заголовки
  2. убедитесь, что ваш файл не печатает какие-либо другие данные до запуска сценария.