Определение корневого местоположения сайта - PullRequest
6 голосов
/ 16 сентября 2011

Мне нужна помощь с понятиями и терминологией, касающимися корневых URL-адресов и каталогов сайта.

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

Допустим, я пишу плагин PHP, который будет использоваться разными веб-сайтами в разных местах, но должен определить базовый каталог веб-сайта.Используя PHP, я всегда смогу определить DOCUMENT_ROOT и SERVER_NAME, то есть абсолютный URL и абсолютный путь к каталогу сервера (или виртуального сервера).Но я не могу знать, установлен ли сам сайт в корневом каталоге или в подкаталоге.Если бы сайт находился в подкаталоге, мне бы понадобилось, чтобы пользователь явно установил переменную «sub-path».Правильно?

Ответы [ 4 ]

13 голосов
/ 16 сентября 2011

Ответ на вопрос 1: Да, вам нужна переменная, которая явно задает корневой путь веб-сайта. Это можно сделать с помощью файла htaccess в корне каждого веб-сайта, содержащего следующую строку:

SetEnv APP_ROOT_PATH /path/to/app

http://httpd.apache.org/docs/2.0/mod/mod_env.html

И вы можете получить к нему доступ в любом месте вашего PHP-скрипта, используя:

<?php $appRootPath = getenv('APP_ROOT_PATH'); ?>

http://php.net/manual/en/function.getenv.php

6 голосов
/ 16 сентября 2011

Будут ли $ url и $ dir всегда указывать на одно и то же место?

Да

<?php 
$some_relative_path = "hello"; 
$server_url = $_SERVER["SERVER_NAME"]; 
$doc_root = $_SERVER["DOCUMENT_ROOT"]; 


echo $url = $server_url.'/'. $some_relative_path."<br />"; 
echo $dir = $doc_root.'/'. $some_relative_path;

Выход:

sandbox.phpcode.eu/hello
/data/sandbox//hello
0 голосов
/ 08 мая 2015

У меня только что была такая же проблема.Я хотел сослаться на ссылки и другие файлы из корневого каталога структуры моего сайта.

Я попробовал следующее, но это никогда не сработало бы так, как я хотел:

$root = $_SERVER['DOCUMENT_ROOT'];
echo "<a href="' . $root . '/index.php">Link</a>";
echo "<a href="' . $root . '/admin/index.php">Link</a>";

Но очевидное решениебыло просто использовать следующее:

echo "<a href="../index.php">Link</a>";
echo "<a href="../admin/index.php">Link</a>";
0 голосов
/ 17 сентября 2011

Вам не нужно просить пользователя предоставить какую-либо информацию.

Этот фрагмент даст вашему коду знать, работает ли он в корне или нет:

<?php
        // Load the absolute server path to the directory the script is running in
        $fileDir = dirname(__FILE__);

        // Make sure we end with a slash
        if (substr($fileDir, -1) != '/') {
            $fileDir .= '/';
        }

        // Load the absolute server path to the document root
        $docRoot = $_SERVER['DOCUMENT_ROOT'];

        // Make sure we end with a slash
        if (substr($docRoot, -1) != '/') {
            $docRoot .= '/';
        }

        // Remove docRoot string from fileDir string as subPath string
        $subPath = preg_replace('~' . $docRoot . '~i', '', $fileDir);

        // Add a slash to the beginning of subPath string
        $subPath = '/' . $subPath;          

        // Test subPath string to determine if we are in the web root or not
        if ($subPath == '/') {
            // if subPath = single slash, docRoot and fileDir strings were the same
            echo "We are running in the web foot folder of http://" . $_SERVER['SERVER_NAME'];
        } else {
            // Anyting else means the file is running in a subdirectory
            echo "We are running in the '" . $subPath . "' subdirectory of http://" . $_SERVER['SERVER_NAME'];
        }
?>
...