Относительный против Абсолютного URL - или, почему не отображаются мои изображения?
Общая проблема для всех программ CGI состоит в том, что программа HTTPD
изменяет текущий каталог на тот, в котором находится загружаемый документ. В
случае программы CGI, текущий каталог установлен на каталог, где находится
программа CGI. Обычно это не проблема, за исключением тех случаев, когда это
приводит к относительному URL.
Относительный URL это тот, который полагает что текущий каталог, является
также и каталогом, в котором размещен HTML файл . Так, например, если у меня
есть URL:
http://my.machine/~rasmus/file.html
Фактический HTML файл мог бы быть:
~rasmus/public_html/file.html
Если внутри файла file.html у меня есть тэг:
<IMG SRC="pic.gif">
В случае если file.html загружен обычным образом то gif файл, как и ожидается,
будет в ~rasmus/public_html/pic.gif. Однако, если он загружен через
программу CGI с URL подобно:
http://my.machine/cgi-bin/php.cgi/~rasmus/file.html
то HTTPD устанавливает текущий каталог на /cgi-bin (или на тот, на который
указывает директива ScriptAlias) и впоследствии, когда страница загружена,
pic.gif файл будет ожидаеться, в каталоге: /cgi-bin/pic.gif, что обычно
является не желательным эффектом.
Быстрый способ решения этой проблемы состоит в том, чтобы использовать
абсолютный URL. Если в вышеупомянутом примере, тэг изображения был:
<IMG SRC="/~rasmus/pic.gif">
то не было бы никакой проблемы. Но дело в том что использование абсолютного
URL не всегда желательно, так как это делает страницы менее переносимыми.
Очевидный вопрос, который Вы можете сейчас задать: " Почему бы PHP
просто не изменяет текущий каталог на правильный? ". Ответ - PHP
фактически изменяет текущий каталог на каталог, в котором расположен
отображаемый HTML файл. Любые пути файлов, используемые внутри скрипта PHP
могут быть относительны. Проблема состоит в том, что тэги, находящиеся вне
области действия PHP типа <img> и <href> не будут обрабатываться
PHP. Когда они анализируются, PHP уже не активен, и текущий рабочий каталог
установлен на каталог, определенный HTTPD.
Решение - состоит в компромиссе. PHP обеспечивает переменную,
называемую PATH_DIR. Она всегда содержит часть каталога из
имени текущего
HTML файла. Если эта переменная PATH_DIR используется в <img> и
<href> тэгах, то может быть достигнут эффект относительного URL , хотя
для сервера при анализе они будут выглядеть как абсолютный URL. Для нашего
вышеприведенного примера , единственое изменение, которое нужно сделать это
изменить тэг img на:
<IMG SRC= "<? ECHO $PATH_DIR>/pic.gif">
Используя вышеприведенную запись, Вы можете перемещать файл, содержащий этот
тэг куда угодно, и тэг всегда будет ссылаться на файл pic.gif в том же самом
каталоге что и исходный HTML файл.
Другой способ решения состоит в том, чтобы использовать традиционный
<BASE HREF= ... > тэг в HTML файле.
[Назад ]
[Содержание ]
[Вперед ]