2013-04-30 4 views
1

Я работаю с сервером LAMP с несколькими сайтами, настроенными как поддомены в Apache. Как стандарт, каждый сайт/поддомен живет в опрятном каталоге внутри/var/www /. Я рассказал Apache, где каждый сайт живет в файлах/etc/apache2/sites-available/config, используя несколько VirtualHosts и указывая DocumentRoot и ServerName для каждого.Apache & PHP: DocumentRoot не работает должным образом

Когда я пишу JavaScript на страницах, я могу ссылаться на другие страницы на основе корня сайта, например:

include '/includes/something.js'; 

Но я не могу сделать то же самое в PHP. Если я хочу, чтобы включить файл в PHP код, мне нужно набрать:

include '/var/www/site_name/includes/something.php'; 

(я все еще могу сделать относительные ссылки, такие как ../includes/something.php, но это рядом с точкой здесь.) Я был смущен тем, зачем мне нужен/var/www /, но до сих пор это было просто досадой. Я мог бы составить код вокруг него, как только я понял, что нужен полный каталог. Но теперь я пытаюсь установить PHPlist, и каждый раз, когда я сохраняю параметр, я перенаправляюсь на URL-адрес, такой как https://phplist.mydomain.org/var/www/phplist/admin/?page=configure - который, конечно, дает мне ошибку «Страница не найдена».

Похоже, что что-то испортилось из-за того, как моя установка Apache/PHP обрабатывает корень сайта. Я не вкопался в код PHPlist и особо не хочу этого делать. Но я предполагаю, что если я могу исправить свои настройки, чтобы включить файлы на PHP без необходимости/var/www/prefix, то PHPlist также перестанет давать мне префиксы URL.

Для справки, вот как выглядит большинство моих виртуальных хостов Apache. Я думаю, что мои конкретные вопросы: 1) вы видите что-то в том, что я вам сказал, что нужно исправлять? 2), где бы вы посмотрели или что бы вы попробовали, чтобы выяснить эту странность?

<VirtualHost 95.102.96.250:443> 
    ServerName phplist.mydomain.org 
    DocumentRoot /var/www/phplist 
    ServerAdmin [email protected] 

    <Directory /var/www/phplist/> 
    Options +FollowSymLinks 
    AllowOverride All 
    order allow,deny 
    allow from all 
    </Directory> 

</VirtualHost> 

Надеюсь, это просто основное недоразумение с моей стороны. Я пробовал RingTFM, но не смог понять, что здесь происходит. Заранее спасибо!

ответ

2

$_SERVER['DOCUMENT_ROOT'] также только решает все, что DocumentRoot установлен в Apache. Вы не должны использовать $_SERVER['DOCUMENT_ROOT'] в среде общего или виртуального хоста, поскольку у вас может не всегда быть правильный каталог.

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

define('DOCUMENT_ROOT', dirname(__FILE__)); 

является это создает глобально определенное DOCUMENT_ROOT что всегда правильно указывает на корень вашего приложения.

3

Javascript является языком сценариев на стороне клиента. Таким образом, ваш браузер обрабатывает / как корень вашего домена, когда он обрабатывает ваш URI запроса (сообщение из браузера на сервер).

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

// so /includes/header.php might include /includes/config.php like this 
include('config.php'); 

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

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

Вы могли бы ради простоты программирования сделать $includes_dir переменная:

$includes_dir = $_SERVER['DOCUMENT_ROOT'].'/includes'; 
include($includes_dir.'/config.php'); 
2

Некоторые виртуальные серверы, основанные на том, как они работают, не используют $_SERVER['DOCUMENT_ROOT'], чтобы указать на корень общедоступного документа, они указывают на/var/www, что неверно. однако они обеспечивают $_SERVER['VIRTUAL_DOCUMENT_ROOT'], что и нужно проверить.

Смежные вопросы