корневой путь не работает с php include - PullRequest
41 голосов
/ 09 сентября 2009

/ в начале ссылки для доступа к корневой папке не работает в php include.

например "/example/example.php"

Какое решение?

Ответы [ 7 ]

56 голосов
/ 09 сентября 2009

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

Для этого вы можете либо

  • добавить корневую веб-папку в , включая путь и include('example/example.php')
  • или вы можете include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')
28 голосов
/ 03 сентября 2010

У меня тоже была эта проблема. Ответ Пола Диксона правильный, но, возможно, это поможет вам понять, почему:

Проблема в том, что PHP является языком на стороне сервера. В тех случаях, когда чистые HTML-документы могут обращаться к файлам на основе корневого URL-адреса, установленного на сервере (т. Е. Для доступа к изображению из любого подкаталога, в котором вы находитесь, вы бы использовали /images/example.jpg для перехода из верхнего каталога вниз), PHP фактически получает доступ к корню сервера при использовании include (/images/example.jpg)

Созданная вами структура сайта фактически находится в файловой системе на сервере Apache. Корень моего сайта выглядит примерно так, начиная с корня сервера и заканчивая:

/home2/siteuserftp/public_html/test/

"test" представляет корень вашего сайта

Таким образом, чтобы ответить на ваш вопрос, почему ваш PHP не получает желаемого результата (он работает точно так, как должен), потому что вы запрашиваете код PHP, чтобы попытаться найти ваш файл в корне сервера, когда на самом деле он находится в корне HTML вашего сайта, который будет выглядеть примерно так, как указано выше.

Ваш файл будет основан на корне сайта "test /" и будет выглядеть примерно так:

/ home2 / siteuserftp / public_html / тест / об / index.php

Ответ Пола Диксона дал:

include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')

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

EDIT:

Дополнительная информация DOCUMENT_ROOT и другие переменные PHP SERVER можно найти здесь

5 голосов
/ 09 сентября 2009

include () (и многие другие функции, такие как require (), fopen () и т. Д.) Работают с локальной файловой системой, а не с веб-корнем.

Итак, когда вы делаете что-то подобное

include( "/example/example.php" );

Вы пытаетесь включить из корня вашей * nix машины.

И хотя есть множество способов приблизиться к тому, что вы делаете, предложения Пола Диксона, вероятно, ваши лучшие ставки.

4 голосов
/ 29 декабря 2017

У каждого веб-сервера есть папка public_html, в которой вы обычно храните свои файлы и т. Д. Используя /, вы не доберетесь до public_html, вместо этого вы направитесь к основному (недоступному) корню. Итак, используйте $_SERVER['DOCUMENT_ROOT']."/your/locati.on" вместо

2 голосов
/ 24 октября 2015

Я решил это на машине под управлением Windows и IIS со следующим:

<?php
  $docroot = 'http://www.example.com/';
  include ($docroot.'inc-header.php');
?>

Если вы работаете на локальной машине разработчика, вы можете заставить свой домен указывать на localhost, добавив следующее в C: \ Windows \ System32 \ drivers \ etc \ hosts

127.0.0.1   www.example.com

Кроме того, вам нужно включить allow_url_include в php.ini, например,

allow_url_include = On
0 голосов
/ 25 июня 2017

некоторые версии PHP могут иметь разделитель в конце корня документа, а другие - нет. На практике вы можете использовать:

    $r = trim(filter_input(INPUT_SERVER, 'DOCUMENT_ROOT', FILTER_SANITIZE_STRING));
    if (substr($r, 0, 1) == '/')
    {
      define("PATCH_SEPARATOR", "/");  
    }
    else
    {
      define("PATCH_SEPARATOR", "\\");    
    }

    if (substr($r, -1) == PATCH_SEPARATOR)
    {
      include_once ($r . 'example/example.php');
    }
    else
    {
      include_once ($r . PATCH_SEPARATOR . 'example/example.php');
    }
0 голосов
/ 24 декабря 2015

Для меня сработал следующий трюк. Я использую Windows с IIS, поэтому DOCROOT - это C: \ Inetpub \ wwwroot.

  1. сделать замену C: \ Inetpub \ wwwroot на диске. Пусть это будет W: (WEB содержимое).
    subst W: C:\Inetpub\wwwroot
  1. отредактируйте php.ini следующим образом: добавьте W: \ к include_path, измените doc_root на W: \

include_path = ".;c:\php\active\includes;W:\"
doc_root = W:\

  1. поместите команду subst в файл CMD в папке автозагрузки для автоматического сопоставления.

Теперь разрешены обе версии:


    include '/common/common.inc'; // access to mapped W: root
    include 'common/common.inc'; // access to W: within include_path

...