Я вызываю контент с одного локально размещенного сайта для использования на другом локально размещенном сайте. (Это для целей воспроизведения URL-адреса без файлов cookie, с которого я буду показывать статический контент.)
Я использую текущую версию XAMPP (5.6.12) с версией PHP 5.6.12 и Apache 2.4.16 (Win32) на Windows 8.1.
Два сайта (оба находятся в каталоге \ xampp \ htdocs) — это MAIN и STATIC, и они настроены соответствующим образом в файле httpd-vhosts.conf, а также в файле хостов Windows. Таким образом, каждый из них работает, и каждый может извлечь контент из другого (с важным исключением, объясненным ниже).
В STATIC есть подкаталог IMAGES, содержащий MY.JPG; поэтому его локальный URL-адрес — STATIC / IMAGES / MY.JPG, когда XAMPP работает, и он отображается.
В файлах моего ГЛАВНОГО локального домена я могу ссылаться на контент в локальном домене STATIC, добавив к имени домена две косые черты, например, //STATIC/IMAGES/MY.JPG. И на самом деле, этот код в INDEX.PHP моего STATIC-домена будет фактически извлекать и отображать JPG:
<img style="display: inline;" src="//STATIC/IMAGES/MY.JPG" />
Нет проблем там. Но когда я передаю этот путь в getimagesize () или другие операторы PHP, вот так:
$resource = "//STATIC/IMAGES/MY.JPG";
$getimagesize = getimagesize($resource);
…Я получаю сообщение, подобное этому:
Предупреждение: getimagesize (// tmb-static / images / my.jpg): не удалось открыть
поток: в C: \ xampp \ htdocs \ MAIN \ INDEX.PHP отказано в доступе в строке 11
После прочтения о подобных проблемах, с которыми сталкиваются другие, я проверил, чтобы убедиться, что для папки, которую я пытаюсь открыть, установлены правильные разрешения. Чтобы определить, кто является текущим пользователем, когда я выполняю этот код локально, я запустил:
$current_user = get_current_user();
print_r("current_user = " . $current_user . "\n");
…и это показало, что текущий пользователь — СИСТЕМА.
Затем я сделал то, что было предложено в другом месте, а именно, чтобы обеспечить полное чтение, запись и все другие доступы к SYSTEM для папки STATIC и ее подпапок, выполнив соответствующие шаги для совместного использования папок и установки разрешений. Я сделал это не только для СИСТЕМЫ, но и для всех, на всякий случай.
К сожалению, getimagesize () и аналогичные операторы выдают одно и то же сообщение «не удалось открыть поток: отказано в разрешении», когда я затем запускаю код, даже если само изображение можно получить и отобразить с помощью простого HTML:
// This works and displays the retrieved image:
echo '<img style="display: inline;" src="//STATIC/IMAGES/MY.JPG" />';
// This immediately fails with message: "failed to open stream: Permission denied..."$getimagesize = getimagesize('//STATIC/IMAGES/MY.JPG');
При условии, что я дал полный контроль над папкой и подпапками STATIC, а также над родительской папкой HTDOCS, что может быть причиной и решением этой неприятной проблемы?
ОБНОВИТЬПрефикс STATIC URL с http:
http://STATIC/IMAGES/MY.JPG
…ошибка меняется на
не удалось открыть поток: HTTP-запрос не выполнен! HTTP / 1.1 403 Запрещено
Но это красная сельдь? Или это просто еще один уровень проблемы с префиксом HTTP: первый шаг?
ОБНОВЛЕНИЕ 2:
Добавив это в файл .htaccess для домена STATIC:
AuthBasicAuthoritative On
AllowOverride All
…ошибка становится:
getimagesize(http://STATIC/IMAGES/MY.JPG):failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error
Обратите внимание, что это после префикса URL домена с http:
Я пропускаю шаг аутентификации?
ОБНОВЛЕНИЕ 3:
Кажется, что на локальном хосте мне нужно предоставить один тип URL для отображения изображения HTML, а другой для отправки файла изображения в функции PHP. Удаляя:
AuthBasicAuthoritative On
AllowOverride All
…из файла .htaccess, а затем изменив мой тестовый код следующим образом:
$html_url = "//STATIC/";
$php_url = "c:/xampp/htdocs/STATIC/";
echo '<img style="display: inline;" src="' . $html_url . 'IMAGES/MY.JPG" />';
$getimagesize = getimagesize($php_url . 'IMAGES/MY.JPG');
print_r($getimagesize);
…проблема решена. Конечно, мне не нужно поддерживать два разных URL для моего локального хоста (ни одна из этих проблем не является проблемой на моем живом сервере) и соответственно редактировать мой код ???
Пожалуйста, не меняйте права доступа к файлам! Пользовательская система уже имеет права на чтение из любой папки.
Ваша проблема в логике пути.
Когда браузер читает HTML и видит путь вроде «//STATIC/IMAGES/MY.JPG», он читает его как «http://example.com/static/images/my.jpg‘, что означает’ your_website_folder / static / images / my.jpg ‘.
Когда ваш сервер читает указанный путь, он видит «some_root_folder / static / images / my.jpg». Эта корневая папка является корнем вашей системы. Что в вашем случае, вероятно, ‘C: / Windows / System32’. Вы видите опасность здесь, верно?
Итак, в качестве решения можно посоветовать создать переменную в php, которая будет хранить корневую папку вашего сайта:
define("__SITE_ROOT" , $_SERVER['DOCUMENT_ROOT']);
//this will define constant with /your_website_folder in it
Затем вы просто добавляете оставшуюся часть вашего пути, вот так:
$img_path = __SITE_ROOT . $resource; // providing //static/images/my.jpg in a $resource
Других решений пока нет …