Включать php файлы, когда они находятся в разных папках

Большая часть моего сайта находится в моем корневом каталоге. И в этом каталоге есть папка "css", "functions", "images". Все работает нормально, когда я включаю php файлы в index.php или любой другой корневой файл. Он включает в себя все и отлично.

Но проблема возникает, когда я создал папку "блог". Таким образом, это совершенно новая и отдельная корневая папка с CMS и ее собственными "корневыми" файлами. И я пытаюсь включить css из основного корневого каталога или некоторых php файлов из папки "functions" в основной корневой каталог, все разбивается. Я знаю, что я должен включить его как ../functions/myfile.com. Но эти файлы включают в себя некоторые другие файлы, поэтому он просто не работает корректно и не сможет правильно включить другие файлы.

Есть ли идея, как решить эту проблему?

Ответ 1

Вы можете добраться до корня из каждого сайта, используя $_SERVER['DOCUMENT_ROOT']. Для ТОЛЬКО ТОЛЬКО для тестирования вы можете отследить путь, чтобы убедиться, что он работает, если вы сделаете это правильно. Вы НИКОГДА не хотите показывать пути локального сервера для таких вещей, как включает и требует.

Сайт 1

echo $_SERVER['DOCUMENT_ROOT']; //should be '/main_web_folder/';

Включает в себя сайт:

echo $_SERVER['DOCUMENT_ROOT'].'/includes/'; // should be '/main_web_folder/includes/';

Сайт 2

echo $_SERVER['DOCUMENT_ROOT']; //should be '/main_web_folder/blog/';

Фактический код для доступа включает в себя с сайта1 внутри сайта2, вы бы сказали:

include($_SERVER['DOCUMENT_ROOT'].'/../includes/file_from_site_1.php');

Он будет использовать только относительный путь файла, выполняющего запрос, если вы попытаетесь получить к нему доступ, исключив document root и root косую черту:

 //(not as fool-proof or non-platform specific)
 include('../includes/file_from_site_1.php');

Входящие пути не имеют места в коде на передней панели (в прямом эфире) сайта в любом месте и должны быть защищены и использоваться только в производственных средах.

Кроме того, для URL-адресов на самом сайте вы можете сделать их относительно домена. Браузеры автоматически заполнят остальные, потому что они знают, на какой странице они смотрят. Поэтому вместо:

<a href='http://www.__domain__name__here__.com/contact/'>Contact</a>

Вы должны использовать:

<a href='/contact/'>Contact</a>

Для хорошего SEO вы захотите убедиться, что URL-адреса для блога не существуют в другом домене, иначе он может быть помечен как дублирующийся сайт. С учетом сказанного вы также можете добавить строку в файл robots.txt для ТОЛЬКО site1:

User-agent: *
Disallow: /blog/

Другие возможности:

Найдите свой IP-адрес и включите этот фрагмент кода:

function is_dev(){
  //use the external IP from Google.
  //If you're hosting locally it 127.0.01 unless you've changed it.
  $ip_address='xxx.xxx.xxx.xxx';

  if ($_SERVER['REMOTE_ADDR']==$ip_address){
     return true;
  } else {
     return false;
  } 
}

if(is_dev()){
    echo $_SERVER['DOCUMENT_ROOT'];       
}

Помните, если ваш интернет-провайдер меняет ваш IP-адрес, так как у вас есть динамический IP-адрес DCHP, вам нужно будет изменить IP-адрес в этом файле, чтобы увидеть результаты. Я бы поставил этот файл в include, а затем потребовал его на страницах для отладки.

Если вы в курсе современных методов, таких как использование журнала консоли браузера, вы можете сделать это и просмотреть его в интерфейсе отладки браузера:

if(is_dev()){
    echo "<script>".PHP_EOL;
    echo "console.log('".$_SERVER['DOCUMENT_ROOT']."');".PHP_EOL;
    echo "</script>".PHP_EOL;       
}

Ответ 2

Если я правильно вас понимаю, у вас есть две папки, в одном из которых содержится ваш php-скрипт, который вы хотите include в файл, находящийся в другой папке?

Если это так, вам просто нужно следовать по тропе правильным путем. Предположим, что ваши папки настроены следующим образом:

root
    includes
        php_scripts
            script.php
    blog
        content
            index.php

Если это предлагаемая структура папок и вы пытаетесь включить файл "Script.php" в свою папку "index.php", вам необходимо включить его следующим образом:

include("../../../includes/php_scripts/script.php");

То, как я это делаю, визуально. Я поместил указатель мыши на index.php (глядя на структуру файла), затем каждый раз, когда я перехожу к папке, я набираю другую "../". Затем вам нужно убедиться, что вы переходите вверх по структуре папок ВЫШЕ папок что вы хотите начать DOWN. После этого это просто обычная иерархия папок.

Ответ 3

Старайтесь никогда не использовать относительные пути. Используйте общий атрибут include, в котором вы назначаете переменную сервера DocumentRoot глобальной переменной и создаете из нее абсолютные пути. В качестве альтернативы для более крупных проектов рассмотрите возможность использования автозагрузчика PSR-0 SPL.

Ответ 4

Ни один из приведенных выше ответов не устранил эту проблему для меня. Я сделал это следующим образом (Laravel с сервером Ubuntu):

<?php
     $footerFile = '/var/www/website/main/resources/views/emails/elements/emailfooter.blade.php';
     include($footerFile);
?>