Ссылка php на файл изображения за пределами веб-каталога по умолчанию

Вот структура каталогов

/domain.com
 /public_html
  /functions
  /image
  /mobile
  /www

папка/domain.com/public_html/www имеет файл index.php веб-каталог по умолчанию -/user/public_html/www в индексном файле есть include, который включает в себя функции с включают "../функции/function.inc" это работает без проблем когда я хочу ссылку на картинку в папке с изображениями, я не получаю никаких результатов например

<img src="../image/graphic/logo.gif" alt="alt text"/>

Кто-нибудь знает, почему ссылка на изображение не работает и как правильно установить ссылку на файл изображения?

Я попробовал <img src="<?php echo $_SERVER['PHP_SELF']; ?>../image/graphic/logo.gif" alt="alt text"/>

но это дает мне тот же результат когда я создаю ссылку вокруг изображения, чтобы перейти к свойствам, я получаю это как путь http://domain.com/image/pc/tattoo_small/small_2008_10_22_001.JPG путь должен быть http://domain.com/public_html/image/pc/tattoo_small/small_2008_10_22_001.JPG когда я пытаюсь перейти непосредственно к этому URL-адресу http://domain.com/public_html/image/pc/tattoo_small/small_2008_10_22_001.JPG Я получаю 404 файл не найдена ошибка потому что веб-каталог по умолчанию /domain.com/public_html/www Я пытался http://domain.com/../image/pc/tattoo_small/small_2008_10_22_001.JPG чтобы попасть в папку с изображениями, но это не помогает.

Есть ли какие-либо идеи или невозможно связать html с графическими файлами вне веб-каталога по умолчанию?

спасибо за прочтение этого момента

Спасибо за ответы до сих пор. Я попытаюсь решить мою проблему с одним из рекомендуемых решений и сообщить о своем рабочем решении здесь. Я хотел, чтобы папка с изображениями находилась на том же уровне, что и папка www и mobile, потому что некоторые изображения, используемые для версии pc (www) и мобильной версии, одинаковы. Конечно, проще просто получить папку с изображениями в www и в мобильной папке, и я думаю, что это то, что я собираюсь делать.

Благодарю всех вас за совет. Основная причина, по которой я не собираюсь работать с script, заключается в том, что script будет трудным решением для легкой проблемы, а также потому, что я действительно не вижу, как вы можете обернуть изображение в классе css и как обеспечить текст alt для изображения.

Ответы

Ответ 1

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

Однако для использования этих изображений можно использовать PHP- script. Таким образом вы можете вызвать изображение, например:

/image.php?file=myfile.jpg

и используйте file_get_contents(), чтобы получить содержимое файла и распечатать его в своем браузере. Вы также должны отправить заголовки клиенту, в этом случае используя PHP header(). Краткий пример:

<?php

    $file = basename(urldecode($_GET['file']));
    $fileDir = '/path/to/files/';

    if (file_exists($fileDir . $file))
    {
        // Note: You should probably do some more checks 
        // on the filetype, size, etc.
        $contents = file_get_contents($fileDir . $file);

        // Note: You should probably implement some kind 
        // of check on filetype
        header('Content-type: image/jpeg');

        echo $contents;
    }

?>

Использование script для этого имеет ряд преимуществ:

  • Вы можете отслеживать загрузки и реализовывать счетчик, например
  • Вы можете ограничить файлы аутентифицированными пользователями
  • ... и т.д.

Ответ 2

Если вы используете Apache в качестве сервера, вы можете настроить его на псевдоним каталога в httpd.conf...

<IfModule mod_alias.c>

    Alias /images/ "/User/Public_html/Image/"

    <Directory "/User/Public_html/Image">
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

</IfModule>

IIRC, папка с псевдонимом не должна находиться внутри веб-сайта.

Ответ 3

Вы не можете обслуживать страницу, находящуюся за пределами веб-каталога, потому что путь не работает, т.е. http://mydomain.com/../page.html просто ссылается на недоступное место.

Если вы действительно хотите обслуживать (статические) файлы, находящиеся за пределами webroot, вы можете написать небольшой PHP script, чтобы прочитать их и вывести их. Таким образом, вы перенаправляете запросы на PHP скрипт, а PHP будет читать соответствующий файл с диска и возвращать его обратно.

Ответ 4

Создайте символическую ссылку внутри веб-корня, которая указывает на нужный каталог.

cd public_html
ln -s ../images

Apache нуждается в директиве конфигурации Options +FollowSymlinks для этой работы (вы можете поместить ее в .htaccess в свой веб-корень).

Написание PHP script, который обслуживает файлы из внешнего корня веб-сайта, поражает цель веб-root. Вам нужно будет проверить пути очень осторожно, чтобы не подвергать весь диск интернету.

Ответ 5

Невозможно напрямую связать файл с сайтом, недоступным для веб-сервера.

Однако вы можете написать PHP script, в котором будут прокси-изображения для вас

<img src="my_php_proxy.php">

потому что PHP может отправлять данные изображения, а также HTML. Этот "образ" PHP не ограничивается той же папкой, что и веб-доступный материал, он может обращаться к любому читаемому файлу на сервере. См. http://www.electrictoolbox.com/image-headers-php/ для получения дополнительной информации

Ответ 6

Вы можете либо сделать ссылку на каталог изображений внутри public___html, переместить каталог изображений в public_html, либо, если у вас есть особая симпатия к свернутым решениям, вы можете написать script, который читает файл изображения и выводит его для пользователя (конечно, если вы не сделаете белый список всех изображений, у вас может возникнуть потенциальная проблема безопасности в ваших руках).