Включение файлов из разных папок после изменения корня документа

Я работаю над проектом, используя WAMP. vhost настроен следующим образом:

<VirtualHost *:80>
   ServerName LearningPHP
   DocumentRoot c:/wamp64/www/learning_php/public/page/
   <Directory  "c:/wamp64/www/learning_php/public/page/">
       Options Indexes FollowSymLinks MultiViews
       AllowOverride All
       Require local
   </Directory>
</VirtualHost>

Файл Windows host выглядит следующим образом:

127.0.0.1       LearningPHP       # Project wamp64/www/learning_php
::1             LearningPHP       # Project wamp64/www/learning_php

Структура проекта выглядит так:

введите здесь описание изображения

Я пытаюсь добиться этого:

  • когда я захожу на веб-сайт, чтобы попасть на learning_php/public/page/index.php (думаю, я сделал это с помощью конфигурации vhost);
  • внутри каждой папки в каталоге page (например, login, profile_add и т. д.) есть два файла: index.php и process.php. Я использовал этот подход, чтобы лучше организовать свой проект (я еще не знаком с шаблоном MVC);
  • внутри папок css и js имя файлов совпадает с именем папки в каталоге page (например, page > profile_add => css/profile_add.css или js/profile_add.js). Позже я объединю все файлы css и js, необходимые странице, в отдельные файлы, чтобы ограничить HTTP-запросы;

Проблема, с которой я сталкиваюсь:

  • Я не могу понять, как включить файлы css и js. Я думаю, это происходит потому, что я переписываю DocumentRoot в конфигурации vhost.

Я пробовал ответы на похожие вопросы, используя константы PHP, но не мог понять, в чем проблема. Например, я попытался добавить этот <link rel="stylesheet" type="text/css" href="../public/css/style.css"> к index.php в папке page, и это не сработало. Я также использовал расположение файла на диске, но безрезультатно.

Буду очень признателен за любую помощь.


person Mihai    schedule 31.03.2016    source источник


Ответы (4)


Хорошо, я нашел другое решение из здесь

Код:

$includePath = str_replace($_SERVER['DOCUMENT_ROOT'], '', str_replace('\\', '/', __FILE__));

Серверы WAMP имеют тенденцию помещать корень документа, вы можете удалить его с помощью str_replace();, поэтому ваш окончательный код должен выглядеть так:

$includeReplace = str_replace($_SERVER['DOCUMENT_ROOT'], '', str_replace('\\', '/', '../css/styles.css'));

затем в html введите:

<link href="<?php echo $includeReplace; ?>" rel="stylesheet" type="text/css" />
person Affix Programmer    schedule 31.03.2016
comment
Пришлось исправить решение - person Affix Programmer; 31.03.2016
comment
я понимаю, почему ваш код не сработал, потому что вы вернулись только к одному файлу вместо двух, чтобы добраться до общей папки - person Affix Programmer; 31.03.2016
comment
Ваша общая папка отстает на 2 директории, ../public/css/styles.css просто добавьте еще ../, так что ../../public/css/styles.css - person Affix Programmer; 31.03.2016
comment
Хорошо, теперь href="<?php echo $includeReplace; ?>" возвращает href="/index.php". Я все еще думаю, что конфигурация vhost вызывает это... - person Mihai; 31.03.2016
comment
попробуйте просто поместить <link href="../css/styles.css" rel="stylesheets" type="text/css" /> в обычный текст без PHP. - person Affix Programmer; 31.03.2016
comment
Я попробовал, и когда я нажимаю view-source, ссылка выглядит так: <link href="../css/style.css" rel="stylesheets" type="text/css" />, а когда я нажимаю, она переходит на http://hrevaluation/css/style.css с кодом 404... - person Mihai; 31.03.2016
comment
хм теперь я знаю почему - person Affix Programmer; 31.03.2016
comment
когда вы просматриваете файл html/php через веб-браузер, он предотвращает поиск файла в корневом каталоге. Ваш домен настроен в папке page. Поэтому, если вы добавите файлы js и css в каталог страницы и поместите <link href="./css/styles.css" rel="stylesheets" type="text/css" />, попробуйте это и посмотрите, работает ли это. - person Affix Programmer; 31.03.2016

Посоветовавшись с кем-то еще по этому вопросу, я пришел к выводу (строго ссылаясь на свой собственный проект), что:

  • Браузер не может получить доступ к структуре, отображаемой над файлом css, потому что она просто находится за пределами document root, указанного в конфигурации vhost. Альтернативой является указание document root на learning_php/public/ и структура проекта следующим образом:

введите здесь описание изображения

  • еще один способ добиться желаемого результата, но без изменения структуры проекта, - прочитать файлы css через PHP, а затем сохранить/вывести содержимое там, где это необходимо.

Суть в том, что, насколько мне удалось выяснить, папки за пределами document root недоступны для браузера (что имеет смысл, учитывая соображения безопасности и то, как большинство фреймворков PHP используют это принцип). Однако одним и тем же файлом можно манипулировать с помощью server-side сценариев.

Пожалуйста, поправьте меня, если я ошибаюсь.

person Mihai    schedule 31.03.2016

попробуйте использовать этот код:

$includePath = dirname(__FILE__) . '../css/styles.css'; затем
include ''.$includePath.''; затем В html:
<link href="<?php echo $includePath; ?>" rel="stylesheet" type="text/css" /> Я обычно не использую ../../path/path/file.txt, и вам нужно вернуться только к одному файлу вместо двух. Попробуйте использовать функцию dirname(__FILE__);, чтобы получить текущий каталог.

Это то, что я использую, надеюсь, что это поможет. Если возникнут проблемы, попробуйте нажать здесь

person Affix Programmer    schedule 31.03.2016
comment
Не могли бы вы пояснить использование этой строки include ''.$includePath.''? Он возвращает: href="C:\wamp64\www\learning_php\public\page../css/styles.css">. Спасибо. - person Mihai; 31.03.2016
comment
вы используете веб-сервер? - person Affix Programmer; 31.03.2016
comment
Обычно это происходит, когда файлы не работают на сервере. - person Affix Programmer; 31.03.2016
comment
Я использую WAMP и виртуальные хосты. Если бы я использовал это '‹link rel=stylesheet type=text/css href=../css/style.css›' (что должно работать). Когда я перехожу к просмотру исходного кода и нажимаю ссылку href, он не загружает файл css, как должен, а скорее переходит к learningphp/public/css/style.css и выдает страницу, которая не найдена. - person Mihai; 31.03.2016
comment
А вы используете вордпресс - person Affix Programmer; 31.03.2016
comment
Нет Вордпресс. Я построил структуру папок с нуля. - person Mihai; 31.03.2016
comment
Хорошо опубликовал новый ответ - person Affix Programmer; 31.03.2016

Попробуйте изменить конфигурацию на:

<VirtualHost *:80>
    ServerName LearningPHP
    DocumentRoot c:/wamp64/www/
    <Directory  "c:/wamp64/www/">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>

если это не сработает, попробуйте:

<VirtualHost *:80>
    ServerName LearningPHP
    DocumentRoot c:/wamp64/www/learning_php/public/page/
    <Directory  "c:/wamp64/www/">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>

то вы можете использовать:

<link href="../css/styles.css" rel="stylesheets" type="text/css" />

person Affix Programmer    schedule 31.03.2016
comment
Большое спасибо за помощь! Извините, что так долго не отвечал, я продолжил изучение проблемы. Я опубликую то, что узнал, в отдельном ответе, чтобы также прикрепить изображение. Также необходимо было заменить stylesheets на stylesheet. - person Mihai; 31.03.2016