Онлайн заработок, создание и монетизация сайтов, веб-разработка, SEO и SMO продвижение, фриланс, партнерки, полезные сервисы вебмастерам, блоггинг.

Wordpress шаблоны
Главная » Web разработка » Ошибка Warning: include() [function.include]: при отключенном URL file-access

Преодоление ошибки Warning: include() [function.include] в PHP

phpПока пишу объемную статью, небольшое полезное сообщение для разработчиков. Разбирался как-то с ошибкой PHP при попытке установить один скрипт и случайно попал на англоязычный блог, где очень подробно, доходчиво было рассказано о проблеме. Точнее это даже не ошибка, а предупреждение, но скрипт все равно не срабатывал.

Итак, если ваша PHP установка на сервере достаточно защищена и отключено URL file-access, а вы пытаетесь вызвать файл через функцию include с использованием абсолютного пути или обращаетесь к удаленному файл,у то столкнетесь с данной проблемой. Например код:

<?
include ("http://www.somedomain.com/file.php");
?>

Приведет к тому, что вы увидите следующие ошибки PHP при просмотре страницы в браузере:

Warning: include() [function.include]: URL file-access is disabled in the server configuration in /home/user/public_html/page.php on line xx

Warning: include(http://www.somedomain.com/file.php) [function.include]: failed to open stream: no suitable wrapper could be found in /home/user/public_html/page.php on line xx

Warning: include() [function.include]: Failed opening ‘http://www.somedomain.com/file.php’ for inclusion (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/user/public_html/page.php on line xx

В PHP 5 функция include для удаленных файлов отключена по умолчанию, и, если ваш сервер использует другую версию PHP, но имеет безопасную установку, вы также столкнетесь с этой ошибкой.

Причина отключения PHP функции include для файлов достаточно простая — это позволит избежать межсайтовых скриптовых (XSS) атак. Это метод, с помощью которого кто-то из недоброжелателей может внедрить свой собственный вредоносный код в ваш, что, как правило, делается для проведения DoS и DDoS атак, а они в свою очередь приводят к падению сервака. Еще есть включения (заражения) в коде страницы, которые содержат и выводят на экран компьютера сообщения мол «такие-то хакеры сломали ваш сайт» вместо стандартного содержимого страницы.

Поэтому если вы собираетесь попросить хостера разрешить эту функцию для удаленных файлов, хорошенько подумайте еще разок.

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

<?
$a = file_get_contents("http://www.somedomain.com/file.php");
echo ($a);
?>

Если вы хотите включить файл, который уже находится на вашем сайте, используйте относительные пути, а не абсолютные:

<?
include (file.php);
?>

Есть еще одно альтернативное решение, которое еще проще записать с помощью функции require_once без использования всяких сторонних переменных:

<?
require_once($_SERVER['DOCUMENT_ROOT'].'file.php');
?>

Именно это решения я использовал для себя, причем удачно — скрипт заработал. В общем, программируйте правильно:) и ошибок не будет. Возможно, у вас есть что добавить ибо заметка достаточно старая, хотя PHP5 все еще актуально, насколько я понимаю.

P.S. Открылась новая система ссылок, где можно прикупить ссылок для своих англоязычных проектов.
Чистая обувь — лицо компании. Машинки для чистки обуви в Москве, можно и в аренду.
Все салоны красоты Украины — специально для женщин.
Для них также женский журнал — интересно и актуально.

21.05.09

Категории: Web разработка.

Теги: , , ,

20 Comments
  1. SeoProfy

    спасибо за пост, он действительно полезен, достаточно подробно расписал =)

  2. DarkFighter

    require_once тормозной

  3. maloypsih

    Ох, PHP для меня темный лес.

  4. Chex

    хм… глупости какие-то :) я не понимаю вас…
    1. Как можно подключить php файл через инклюд с другого сервера? О_О по протоколу http передаются ведь не исходные коды php файла, а сгенерированный им текст, а инклюд — это подключение php файлов и ФИЗИЧЕСКИ НЕВОЗМОЖНО ПОДКЛЮЧИТЬ УДАЛЕННЫЙ ФАЙЛ ТАКИМ ОБРАЗОМ (это вообще никак невозможно, на самом деле…)
    2. include, require и file_get_contents, file и т.д. выполняют разные действия. Первые подключают и передают интерпритатору на выполнение php код, а вторые считывают в переменную содержание файла и этот файл может быть загружен через http, ftp…
    3. Если вы хотите подавить Warning в конкретной строке то перед вызовом функции поставте @, например:

    даже если файла file.php не существует ошибка показана не будет. К стати. Правилом хорошего тона считается писать не <?, а <?php ибо short_php_tag может быть выключен по умолчанию на сервере от чего могут вызвать о вас неприятное впечатление…

    Далее, для тех кто не в курсе. Есть по функционалу разные типы подключаемых функций:
    include, include_once и require, require_once разница в том, что первые будут подключать и передавать файл интерпритатору каждый раз когда он будет вызван. Подробнее описал у себя в блоге http://homebie.com/blog-show/id/197 просто там много писать на эту тему

  5. Tod

    Chex, спасибо за подробный комментарий) Я, в принципе, сильно на PHP не программирую и вообще, поэтому кое-где могла закрасться неточность. У меня просто возникла данная ошибка, я нашел решение в инете, попробовал — сработало, поэтому и поделился им с читателями:)

  6. inginer

    Спасибо это работает !

  7. настя

    очень полезная заметка, мне помогла. спасибо

  8. Zerg

    Спасибо, очень помогло… хостер отключил возможность инклюда, и вся поддержка молчит, в день звонков десять сделал, и ругался и делал что они предлагали.. а сайт то валится, посетители уходят (интернет-магазин) с сайта.. теперь буду знать, а рбк уроды, говорят не знаем, что у вас случилось, сделайте трассировку и пинг, я сам в полном удивлении, через командную строку вижу сайт, в браузере не вижу… один всё таки из поддержки сказал, что были недавно дос атаки на сервер и всё уже починили))) отключив абсолютный инклюд.
    Ещё раз спасибо, будем учиться правильно программировать)

  9. Патрик

    спасибо огромное, очень помогла статья. к сожалению, об этой проблеме мало кто пишет, в основном все передирают статьи про базовые навыки изготовления шаблона, а как в вордпресс подключить произвольный php файл, никто не упоминает.

    еще раз спасибо!!!

  10. Илья

    Огромное СПАСИБО!!!
    Долго не мог натсроить абсолютный путь к файлу в include, ваша статья помогла.

  11. Алексей

    Спасибо!!! Наконец-то вопрос решен. Полезная статья.

  12. андрей

    недавно заметил такую ошибку, когда в поиск вводишь слово и если его нет на сайте, то выкидывает такую ошибку
    в коде нашел

    и удалил include
    все вроде нормально работает.
    я верно сделал или проблема не в этом?

  13. Tod

    андрей, поудалял все посты, где код не добавился.. если все работает, то скорее всего сделал правильно:)

  14. Олег

    Спасибо, мне очень помогла Ваша статья!

  15. Сергей

    Спасибо, всё заработало, а то уже руки опускались.

  16. Андрей

    Я делетант в этом деле еще, обновил плагин woocommerce и теперь не открывается сайт, выдает ошибки про которые тут говорится, вопрос: в какой файл (куда) прописать функцию, чтобы все исправить?

  17. Tod

    Андрей, если честно, помочь с вашей проблемой мне будет сложно. В статье описана ее суть. Вы можете попросить помощи у хостера, можете внимательно посмотреть в каких именно файлах возникает ошибка дабы потом найти ее причину. Если проблема именно в функции include, то заменить ее на require_once.

  18. Serg

    Большое спасибо. Очень информативная и полезная статья. Особенно для интернет магазинов

  19. Владимир

    Долго бился над всякими попытками в вордпресс типа использования функции plugins_url() и php_flag allow_url_fopen On а также и php_flag allow_url_include On и ничего не помогало, хотя на том же хостинге лендинг и там include_once() прекрасно работает, а в вордпресс почему то не хочет!
    А Ваш способ с require_once($_SERVER[‘DOCUMENT_ROOT’].’file.php’); помог, хотя проверил и incude_once($_SERVER[‘DOCUMENT_ROOT’].’file.php’); так тоже срабатывает в таком варианте!
    В общем СПАСИБО за статью! :)

  20. Михаил

    спс чувак, помогло

Добавить комментарий

Ваш e-mail не публикуется. Обязательные поля помечены *
Если вы комментируете впервые, то текст будет отправлен на модерацию.