$_SERVER['DOCUMENT_ROOT'] 没有 return 预期的目录位置

$_SERVER['DOCUMENT_ROOT'] does not return the expected directory location

我访问了我网站的子文件夹并收到此错误:

PHP Warning:  include_once(): Failed opening '/var/www/html//include/version.inc' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /srv/sparrow/php/include/branches.inc on line 3

似乎 $_SERVER['DOCUMENT_ROOT'] return 错误的目录如下:

/var/www/html/

如果我访问 www.my.website/php,这应该是 $_SERVER['DOCUMENT_ROOT' 的预期目录]] 应该 return:

/var/www/html/php/

这些是我的虚拟主机配置:

NameVirtualHost *:80

<VirtualHost *:80>
   ServerName   www.mywebsite.com
   DocumentRoot /var/www/html/

   <Directory /var/www/html/>
     Options -Indexes -MultiViews
   </Directory>
</VirtualHost> 

<VirtualHost *:80>
  ServerName   www.mywebsite.com/ph
  # Webroot of PHP site
  DocumentRoot /var/www/html/php/

  <Directory /var/www/html/php/>
    Options -Indexes -MultiViews
  </Directory>
</VirtualHost> 

如何配置我的虚拟主机配置,以便如果我访问 www.my.website/php 它应该 return DocumentRoot 值为 /var/www/html/php/ ?

谢谢大家!

您在端口 80 上有两个虚拟主机。先赢。您应该通过 IP、服务器名或端口来区分它们。如果两个 运行 在同一个端口上,如果您使用的是 Apache 2.2(2.4 不需要),您还需要 NameVirtualHost 80

我很确定,如果你交换虚拟主机,你会得到 /var/www/html/php/$_SERVER['DOCUMENT_ROOT']

但仍然: 如果您有两个虚拟主机,请将它们区分!


更新

在上层虚拟主机中进行额外的重写(需要 mod_rewrite 激活),因此您可以删除第二个虚拟主机:

RewriteEngine On
RewriteRule ^/ph/(.*)$ http://www.mywebsite.com/ph/ [R=301,L]

[P,L] 如果你想隐藏你正在重写,但是 [P] 也需要 mod_proxy 被激活。