file_exists или getimagesize работают только с локальными, абсолютными путями к файлам, но не с URL-адресами в переполнении стека

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

Я использую следующий код для отображения стандартного логотипа на сайте интрасети или пользовательского логотипа:

if(L_HEADER) {
$logo = L_HEADER;
}
else {
$logo = 'logo.png';
}
$properties = getimagesize(CONFIG_URL . 'images/' . $logo)

L_HEADER и CONFIG_URL — это константы с предопределенными значениями (другой файл):

  1. L_HEADER содержит «opb_beta.png»
  2. CONFIG_URL содержит «Http: //billing.intranet.opb/«

Конкатенация работает правильно, что также подтверждается сообщением об ошибке лог-файла Apache:

Предупреждение PHP: getimagesize (Http: //billing.intranet.opb/images/opb_beta.png): не удалось открыть поток: ошибка HTTP-запроса! HTTP / 1.1 404 НЕ НАЙДЕН
в /var/www/billing/templates/header.inc.php в строке 42

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

echo '<img src="' . CONFIG_URL . 'images/' . $logo . '"width="' . $properties[0] . '" height = "' . $properties[1] . '" />";

Поскольку я получаю ошибку, упомянутую выше, высота и ширина равны «0», но, глядя на исходный код, URL-адрес в порядке, доступ к нему вручную открывает изображение, а при замене ширины и высоты на ручные значения изображение отображается очень хорошо. ,

Более любопытно, хотя (а также мой текущий finx), при изменении getimagesize на следующее, это работает просто отлично:

$properties = getimagesize($_SERVER['DOCUMENT_ROOT'] . /public_html/images/' . $logo);

Я упомяну, что я использую редирект Apache; Вот почему в URL вы не видите «public_html», а в абсолютном пути второго примера вы его видите.

То же самое происходит с «file_exists». URL не работает, абсолютный локальный путь к тому же файлу работает.

Еще одно любопытство: в другом куске кода я проверяю обновления на сайте. Там я использую «реальный» публичный URL с file_exists и fopen. Я выгляжу так и прекрасно работает:

if(file_exists('http://desk.co.cr/df_stable.txt') {
if(($handle = fopen('http://desk.co.cr/df_stable.txt', 'r')) !== FALSE) {
// some other code
}
}

Теперь то, что я уже проверил:

  • Права доступа к файлам установлены правильно, для всего пути, с www-данными, являющимися группой и владельцем всех файлов и доступом для чтения и записи для файла изображения
  • allow_url_fopen в значении «On».
  • open_basedir имеет значение «no value», и в определениях виртуальных хостов Apache нет переопределений.
  • файл определенно существует и синтаксис + путь верны.

Некоторая справочная информация:

  • Сервер работает на Ubuntu 14.04 LTS
  • Apache 2.4.7
  • PHP 5.5.9

Пока у меня нет идей.

5

Решение

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

Еще одно любопытство: в другом куске кода я проверяю обновления на сайте. Там я использую «реальный» публичный URL

Итак, неверный URL-адрес относится к непубличному домену, который был настроен на вашем ПК для поиска правильного IP-адреса. Скорее всего, это было сделано либо путем запуска локального DNS-сервера, либо путем настройки файла «hosts» ПК для жесткого кодирования адреса для этого домена.

Однако, когда вы запрашиваете URL-адрес у самого сервера, в игру вступает совершенно другая конфигурация DNS, поэтому, вероятно, он просто не знает, где находится этот сервер — даже если он сам! Вам необходимо настроить параметры DNS сервера или /etc/hosts чтобы соответствовать тому, что на вашем компьютере.

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

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

nslookup billing.intranet.opb
# if that returns the right IP address, see if it's reachable:
ping billing.intranet.opb
# and if it's the right server, it will be listening on port 80:
telnet billing.intranet.opb 80
# telnet will either time out, or connect and give you a prompt

Если telnet соединяется, вы даже можете написать HTTP-запрос вручную (пустая строка завершает запрос; не занимайте слишком много времени, иначе сервер выручит), например:

HTTP/1.1 HEAD /
Host: billing.intranet.opb
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]