Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > Общие вопросы Web
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2013, 12:46   #1
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию Абсолютный путь. Относительный путь. Запутался.

Всем привет! Который раз уже сталкиваюсь с проблемой в прописании путей при запросе к файлам (имеются ввиду, например, атрибуты src или href у тэгов, урл при ajax запросе, путь в include_once и т. д.)

В чем сама проблема(к примеру):

Подключаем стиль онлайн помощника, который используется на всех страницах сайта
Код:
<link rel="stylesheet" href="/css/chat.css" type="text/css">
Тут указан абсолютный путь, по идее все правильно (наверное).
Но когда мы переходим на внутренние страницы с адресом, скажем http://site.ru/param/pam/pam - абсолютный путь как будто бы меняется, и браузер пытается взять файл из несуществующей папки param/pam/pam/css/chat.css

Я решил эту проблему указанием пути следующим образом:
Код:
<link rel="stylesheet" href="../../../css/chat.css" type="text/css">
Я знаю это неправильно, так как уровень вложенности страниц, например, может быть динамичным, и меняться со временем, становясь глубже. Тогда этот вариант уже не поможет.

Еще один пример:

Есть ajax-запрос, который работает на странице http://site.ru/admin/news:
Код:
$.post("func/delete.php",{id:id},"text");
Этот же запрос в скрипте должен работать и на странице, к адресу которой добавляется еще один GET-параметр: http://site.ru/admin/news/svejaya_postavka
В этом случае опять сбивается путь(
Я решил это следующим образом:
Код:
$.post("<?if($_GET[param3]!=NULL){?>../<?}?>func/delete.php",{id:id},"text");
Опять же я считаю, что это неправильно и, наверняка, можно сделать по-другому.

Еще одна проблема, с которой я часто сталкиваюсь:

Иногда я делаю некоторые проекты на локалке (использую Denwer). Пусть один из них находится в папке X:\home\localhost\www\new_project
Я пишу пути в ссылках и ajax-запросах, указывая папку new_project, потому что у денвера, я так понимаю, абсолютный путь идет из папки www (я не знаю можно ли это как то изменить, пожтому я даже не могу использовать ЧПУ в .htaccess - не работает почему то).
Получается следующее:
Код:
<a href="/new_project/index.php?param1=login&param2=reg" title="">ссылка</a>
При переносе на хостинг, приходится менять вручную пути во всех ссылках и запросах.


Подскажите пожалуйста, как можно все стандартизировать? Можно ли задать каким то образом корневую папку, чтоб та не менялась из за GET параметров? Или что то в этом роде. Надеюсь на поддержку в решении этой проблемы. Заранее всем большое спасибо!
Mr_freeman вне форума Ответить с цитированием
Старый 19.03.2013, 22:24   #2
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,603
По умолчанию

Для href, src, get, post запросов берете путь от точки входа на сайт открытого для веб пространства. Можно использовать относительные (для href, src), но не вижу преимуществ.
Для инклудов, тоже можно использовать как относительные так и абсолютные пути.
Как вариант:
PHP код:
define('ROOT_PATH',realpath($_SERVER["DOCUMENT_ROOT"]));  
include 
ROOT_PATH."/inc/include1.php"

Последний раз редактировалось Gorychev; 19.03.2013 в 22:28.
Gorychev вне форума Ответить с цитированием
Старый 21.03.2013, 10:29   #3
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от Gorychev Посмотреть сообщение
Для href, src, get, post запросов берете путь от точки входа на сайт открытого для веб пространства. Можно использовать относительные (для href, src), но не вижу преимуществ.
Для инклудов, тоже можно использовать как относительные так и абсолютные пути.
Как вариант:
PHP код:
define('ROOT_PATH',realpath($_SERVER["DOCUMENT_ROOT"]));  
include 
ROOT_PATH."/inc/include1.php"
Действительно, в инклудах хорошо работает. А вот с картинками и яваскриптом пока не понятно что делать( Может еще какие то варианты есть?
Mr_freeman вне форума Ответить с цитированием
Старый 21.03.2013, 11:31   #4
buriat
Форумчанин
 
Регистрация: 28.06.2010
Сообщений: 189
По умолчанию

Цитата:
Сообщение от Mr_freeman Посмотреть сообщение
Подключаем стиль онлайн помощника, который используется на всех страницах сайта
Код:
<link rel="stylesheet" href="/css/chat.css" type="text/css">
Тут указан абсолютный путь, по идее все правильно (наверное).
Но когда мы переходим на внутренние страницы с адресом, скажем http://site.ru/param/pam/pam - абсолютный путь как будто бы меняется, и браузер пытается взять файл из несуществующей папки param/pam/pam/css/chat.css
Цитата:
Сообщение от Mr_freeman Посмотреть сообщение
Есть ajax-запрос, который работает на странице http://site.ru/admin/news:
Код:
$.post("func/delete.php",{id:id},"text");
Этот же запрос в скрипте должен работать и на странице, к адресу которой добавляется еще один GET-параметр: http://site.ru/admin/news/svejaya_postavka
В этом случае опять сбивается путь(
Вобще то если в src или href в начале ставишь "/", то поиск файла всегда идет от root директории и она не должна меняться.
buriat вне форума Ответить с цитированием
Старый 21.03.2013, 14:11   #5
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

PHP код:
function getScriptUrl()
{
    
$scriptName=basename($_SERVER['SCRIPT_FILENAME']);
    if(
basename($_SERVER['SCRIPT_NAME'])===$scriptName)
        
$scriptUrl=$_SERVER['SCRIPT_NAME'];
    elseif(
basename($_SERVER['PHP_SELF'])===$scriptName)
        
$scriptUrl=$_SERVER['PHP_SELF'];
    elseif(isset(
$_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME'])===$scriptName)
        
$scriptUrl=$_SERVER['ORIG_SCRIPT_NAME'];
    elseif((
$pos=strpos($_SERVER['PHP_SELF'],'/'.$scriptName))!==false)
        
$scriptUrl=substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$scriptName;
    elseif(isset(
$_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT'])===0)
        
$scriptUrl=str_replace('\\''/'str_replace($_SERVER['DOCUMENT_ROOT'], ''$_SERVER['SCRIPT_FILENAME']));
    else
        throw new 
Exception('Unable to determine the entry script URL.');
    return 
rtrim(dirname($scriptUrl),'\\/');

Вот как-то так. Потом везде, где хочешь вызывать картинку какую или ещё чего, то делаешь так:
<img src="<?= getScriptUrl() ?>/images/myimage.jpg" alt="" />
<a href="<?= getScriptUrl() ?>/mypage">blah</a>
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 22.03.2013, 08:43   #6
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от buriat Посмотреть сообщение
Вобще то если в src или href в начале ставишь "/", то поиск файла всегда идет от root директории и она не должна меняться.
Я тож так думал, но путь все равно сбивается. Может как то можно указать рут директорию в мета тегах или аштаксессе?
Mr_freeman вне форума Ответить с цитированием
Старый 22.03.2013, 08:57   #7
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от Johnatan Посмотреть сообщение
PHP код:
function getScriptUrl()
{
    
$scriptName=basename($_SERVER['SCRIPT_FILENAME']);
    if(
basename($_SERVER['SCRIPT_NAME'])===$scriptName)
        
$scriptUrl=$_SERVER['SCRIPT_NAME'];
    elseif(
basename($_SERVER['PHP_SELF'])===$scriptName)
        
$scriptUrl=$_SERVER['PHP_SELF'];
    elseif(isset(
$_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME'])===$scriptName)
        
$scriptUrl=$_SERVER['ORIG_SCRIPT_NAME'];
    elseif((
$pos=strpos($_SERVER['PHP_SELF'],'/'.$scriptName))!==false)
        
$scriptUrl=substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$scriptName;
    elseif(isset(
$_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT'])===0)
        
$scriptUrl=str_replace('\\''/'str_replace($_SERVER['DOCUMENT_ROOT'], ''$_SERVER['SCRIPT_FILENAME']));
    else
        throw new 
Exception('Unable to determine the entry script URL.');
    return 
rtrim(dirname($scriptUrl),'\\/');

Вот как-то так. Потом везде, где хочешь вызывать картинку какую или ещё чего, то делаешь так:
<img src="<?= getScriptUrl() ?>/images/myimage.jpg" alt="" />
<a href="<?= getScriptUrl() ?>/mypage">blah</a>
Для ссылок и картинок это сработает, хотя, на мой взгляд
, проще указать название сайта в конфигурационном файле для абсолютного пути:
PHP код:
define(SITE,'http://site.ru'); 
Код:
<img alt="" src="<?=SITE?>/images/picture.jpg"/>
Ладно, с инклудами и адресами в тегах вроде разобрались. Но что делать с адресами аякс-запросов? Ведь в отдельный js-файл не вставишь кусочек php-кода. Или так же в конфигурационном файле объявить глобальную js-переменную?
Код:
<script>
var site='<?=SITE?>';
</script>
Mr_freeman вне форума Ответить с цитированием
Старый 22.03.2013, 12:50   #8
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Mr_freeman
Мой вариант работает вне зависимости от того, с какого домена заходят на сайт. Что, если у вас несколько доменов? Сейчас может и нет нескольких, а что если будет? Придётся многое менять. Аналогично с каталогом размещения.

Идея про глобальную переменную из PHP в Javascript правильна.

Кстати, глобальную константу с относительным адресом можно и в PHP сделать, вызвав мою функцию один раз. А дальше вставлять только константу.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 22.03.2013, 13:03   #9
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от Johnatan Посмотреть сообщение
Mr_freeman
Мой вариант работает вне зависимости от того, с какого домена заходят на сайт. Что, если у вас несколько доменов? Сейчас может и нет нескольких, а что если будет? Придётся многое менять. Аналогично с каталогом размещения.
Приведите пожалуйста пример, не совсем понял, что вы имеете ввиду.
Mr_freeman вне форума Ответить с цитированием
Старый 22.03.2013, 13:27   #10
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

У тебя есть сайт например kirpichi.ru
Ты задаёшь в коде у себя
PHP код:
define(SITE,'http://kirpichi.ru'); 
А теперь представь, что шеф тебе говорит "Мы покупаем домен кирпичи.рф"
Что будешь делать?
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заменить абсолютный путь относительным Delphi Kreadlling БД в Delphi 3 28.03.2012 14:19
Абсолютный путь к файлу/папке Red_Line Общие вопросы по Java, Java SE, Kotlin 0 16.02.2012 22:06
СИ относительный путь rootv Помощь студентам 0 29.04.2011 14:54
Относительный путь в TwebBrowser Scorpeon Общие вопросы Delphi 1 11.04.2010 17:50
как получить относительный путь? Alar Общие вопросы Delphi 0 30.10.2006 00:27