Доступ к элементу подкаталога из файла другого подкаталога Php + Apache2

167
07 октября 2018, 18:20

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

Ситуация следующая:
Разрабатываю сайт, структура примерно такая:

    1) structure (*каталог где хранятся элементы встраиваемые в другие страницы*)  
    1.1) logo.php  
    1.2) menu_side.php  
    1.3) footer.php    
    2) pages (*каталог хранит основные страницы*)  
    2.1) moskow_info (*подкаталог, где хранятся информация о городе вместе с картинками и страницами*) 
    -moscow.php  
    2.2) spb_info  
    -spb.php  
    2.3) rostov_info  
  -rostov.php  
3) images  
- logo.png

Допустим, мне нужно вставить logo.php во все страницы типа moscow.php, spb.php, rostov.php. Делаю это так:

<header id="header">  
<?php   
     include_once $_SERVER['DOCUMENT_ROOT']."/structure/logo.php";
?>   
</header>

В свою очень, logo.php содержит ссылку на картинку, в виде такого когда:

<?php  
$a = $_SERVER['DOCUMENT_ROOT']."/images/logo.png"; ?>
<a href="index.php"><img src="<?php echo $a; ?>" /></a> 

Вызываю страницу test.ru/pages/moscow.php. По идее, должна отобразиться картинка из logo.php, но изображение данным образом не отображается. Когда открываю Исходных код страницы, там видно что путь прописывается правильно:

<a href="index.php"><img src="C:/Program Files (x86)/Apache2.4/htdocs/region.ru/www/images/logo.png" alt="" /></a>  

Скажите пожалуйста, в чем может быть проблема? Спасибо.

Answer 1

Ошибка заключается в непонимании того, что есть уровень файловой системы и уровень документов веб-сервера. Разберемся.

Как работает веб-сервер

Когда на веб-сервер прилетает запрос "дай мне документ /images/logo.png", то веб-сервер "складывает" корень веб-документов и путь к запрашиваемому документу.

Apache: корень веб-документов прописывается так:

<VirtualHost *:80>
  # виртуальный хост
  ServerName site.ru
  # корень веб-документов
  DocumentRoot /var/www/site.ru/www
  # остальные настройки
</VirtualHost>

Если у вас Nginx, то так:

server {
  # порт
  listen              80;
  # виртуальный хост
  server_name         site.ru;
  # корень веб-документов
  root                /var/www/site.ru/www;
  # остальные настройки
}

Таким образом, получается /var/www/site.ru/www + /images/logo.png = /var/www/site.ru/www/images/logo.png - это абсолютный путь к файлу в файловой системе, веб-сервер находит этот документ, и отправляет пользователю в браузер.

Как работает PHP

PHP - это всего лишь скрипт, который запускается веб-сервером. Если в нем будет строчка

include_once "/structure/logo.php";

то PHP не найдет этот файл, ведь этот путь от корня файловой системы. В этом и заключается отличие от веб-сервера, который будет смотреть не с /, а с корня веб-документов.

Резюме

Используйте в PHP абсолютный путь:

include_once $_SERVER['DOCUMENT_ROOT']."/structure/logo.php";

используйте в генерируемом HTML не C:/Program Files (x86)/Apache2.4/htdocs/region.ru/www/images/logo.png, а

<img src="/images/logo.png">

веб-сервером это будет преобразовано в абсолютный путь с учетом корня веб-документов и отправлено по HTTP в браузер

READ ALSO
Из контролера во View передать ccылку?

Из контролера во View передать ccылку?

это все в контроллере и ссылка не работает правильно, как изменить в Laravel?

185
Не работает запрос INSERT INTO mysql

Не работает запрос INSERT INTO mysql

INSERT ничего не добавляет в БД при использовании в VALUES переменных, как только я уже не пробовал записывать, не понимаю как всё таки нужноНо работает...

172
Конвертировать файл DOC to PDF libreoffice-core

Конвертировать файл DOC to PDF libreoffice-core

Всем добрый день! У меня встала задача, выводить на сайте файлы DOC в виде PDFИсходный файл DOC храниться в базе данных в виде бинарного кода

183