Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

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

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

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

icq: 452391271
skype: anvil_god
По умолчанию Абсолютный путь. Относительный путь. Запутался.

Всем привет! Который раз уже сталкиваюсь с проблемой в прописании путей при запросе к файлам (имеются ввиду, например, атрибуты 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,555
Репутация: 1176
По умолчанию

Для 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
Репутация: 28

icq: 452391271
skype: anvil_god
По умолчанию

Цитата:
Сообщение от 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
Адрес: Vilnius
Сообщений: 189
Репутация: 79
По умолчанию

Цитата:
Сообщение от 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
Репутация: 430
По умолчанию

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
Репутация: 28

icq: 452391271
skype: anvil_god
По умолчанию

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

icq: 452391271
skype: anvil_god
По умолчанию

Цитата:
Сообщение от 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
Репутация: 430
По умолчанию

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

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

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

icq: 452391271
skype: anvil_god
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заменить абсолютный путь относительным 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 01:27


10:30.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru