php ссылка на файл изображения вне веб-каталога по умолчанию - PullRequest
14 голосов
/ 03 ноября 2008

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

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

в папке /domain.com/public_html/www есть файл index.php веб-каталог по умолчанию / user / public_html / www в индексном файле есть включение, которое включает в себя функции с включают "../ функции / 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 и мобильной папкой, поскольку некоторые изображения, используемые для версии для ПК (www) и мобильной версии, совпадают. Конечно, проще всего получить папку с изображениями на www и в мобильной папке, и я думаю, что это то, что я собираюсь сделать.

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

Ответы [ 6 ]

32 голосов
/ 03 ноября 2008

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

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

/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;
    }

?>

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

  • Вы можете отслеживать ваши загрузки и использовать счетчик, например
  • Вы можете ограничить файлы для аутентифицированных пользователей
  • ... и т. Д.
16 голосов
/ 03 ноября 2008

Если вы используете 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, папка с псевдонимами не обязательно должна быть внутри webroot.

9 голосов
/ 03 ноября 2008

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

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

5 голосов
/ 15 ноября 2008

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

cd public_html
ln -s ../images

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

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

1 голос
/ 03 ноября 2008

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

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

<img src="my_php_proxy.php">

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

0 голосов
/ 03 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...