PHP奇怪的文档\u根

PHP奇怪的文档\u根,php,shared-hosting,document-root,k2f,Php,Shared Hosting,Document Root,K2f,因此,基本上,我正在编写一个框架,作为其功能的一部分,它应该为最终开发人员提供一组完善的URI/路径 其中有两个路径使用$\u SERVER['DOCUMENT\u ROOT']: /** * Absolute filesystem path to web root install (aka docroot). * @example "C:/wamp/www" OR "/home/visitgoz/public_html/" */ CFG::set('ABS_WWW', str_r

因此,基本上,我正在编写一个框架,作为其功能的一部分,它应该为最终开发人员提供一组完善的URI/路径

其中有两个路径使用
$\u SERVER['DOCUMENT\u ROOT']

/**
 * Absolute filesystem path to web root install (aka docroot).
 * @example "C:/wamp/www" OR "/home/visitgoz/public_html/"
 */
CFG::set('ABS_WWW',
    str_replace(
        $tmpseps,
        DIRECTORY_SEPARATOR,
        truepath($_SERVER['DOCUMENT_ROOT']).'/'
    )
);

/**
 * K2F path relative to web root.
 * @example /K2F/
 */
CFG::set('REL_K2F',
    str_replace(
        array('//','\\'),
        '/',
        str_replace(CFG::get('ABS_WWW'),'/',CFG::get('ABS_K2F'))
    )
);
代码经过了微调,可以在Linux和Windows上工作。显然,它大部分时间在Linux上工作,实际上在VPSE上非常无缝

然而,最近,我在一个(共享主机)上尝试了它,结果都失败了。 我已在有问题的机器上打印出$\u服务器内的数据:

Array
(
**  [DOCUMENT_ROOT] => /usr/local/apache/htdocs
    [GATEWAY_INTERFACE] => CGI/1.1
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_LANGUAGE] => en-gb,en;q=0.5
    [HTTP_CONNECTION] => keep-alive
    [HTTP_COOKIE] => <snip>
    [HTTP_HOST] => <snip>
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_USER_AGENT] => <snip>
    [PATH] => /bin:/usr/bin
    [QUERY_STRING] => 
    [REDIRECT_STATUS] => 200
    [REMOTE_ADDR] => <snip>
    [REMOTE_PORT] => 49262
    [REQUEST_METHOD] => GET
    [REQUEST_URI] => /~sitename/
**  [SCRIPT_FILENAME] => /home/sitename/public_html/index.php
    [SCRIPT_NAME] => /~sitename/index.php
    [SERVER_ADDR] => <snip>
    [SERVER_ADMIN] => <snip>
    [SERVER_NAME] => <snip>
    [SERVER_PORT] => 80
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_SIGNATURE] => 
Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at <snip> Port 80


    [SERVER_SOFTWARE] => Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
    [UNIQUE_ID] => TVox-Eo1Z8IAAG1kAh4AAAEZ
    [PHP_SELF] => /~sitename/index.php
    [REQUEST_TIME] => 1297756668
    [argv] => Array
        (
        )

    [argc] => 0
)
数组
(
**[DOCUMENT\u ROOT]=>/usr/local/apache/htdocs
[网关接口]=>CGI/1.1
[HTTP_ACCEPT]=>text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
[HTTP_ACCEPT_CHARSET]=>ISO-8859-1,utf-8;q=0.7,*;q=0.7
[HTTP\u ACCEPT\u ENCODING]=>gzip,deflate
[HTTP\u ACCEPT\u LANGUAGE]=>en gb,en;q=0.5
[HTTP\u连接]=>保持活动状态
[HTTP_COOKIE]=>
[HTTP\u主机]=>
[HTTP_KEEP_ALIVE]=>115
[HTTP\u用户\u代理]=>
[路径]=>/bin:/usr/bin
[查询字符串]=>
[重定向\u状态]=>200
[远程地址]=>
[远程_端口]=>49262
[请求\u方法]=>获取
[请求URI]=>/~sitename/
**[SCRIPT\u FILENAME]=>/home/sitename/public\u html/index.php
[SCRIPT_NAME]=>/~sitename/index.php
[服务器地址]=>
[服务器管理]=>
[服务器名称]=>
[服务器端口]=>80
[服务器协议]=>HTTP/1.1
[服务器签名]=>
端口80处的Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635服务器
[服务器软件]=>Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
[UNIQUE_ID]=>TVox-Eo1Z8IAAG1kAh4AAAEZ
[PHP_SELF]=>/~sitename/index.PHP
[请求时间]=>1297756668
[argv]=>阵列
(
)
[argc]=>0
)
还有我的机器:

Array
(
    [HTTP_AUTHORIZATION] => 
    [HTTP_HOST] => <snip>
    [HTTP_USER_AGENT] => <snip>
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => en-gb,en;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_CONNECTION] => keep-alive
    [PATH] => <snip>
    [SystemRoot] => C:\Windows
    [COMSPEC] => C:\Windows\system32\cmd.exe
    [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    [WINDIR] => C:\Windows
    [SERVER_SIGNATURE] => 
    [SERVER_SOFTWARE] => Apache/2.2.11 (Win32) PHP/5.3.1
    [SERVER_NAME] => <snip>
    [SERVER_ADDR] => <snip>
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => <snip>
**  [DOCUMENT_ROOT] => C:/wamp/www/
    [SERVER_ADMIN] => admin@localhost
**  [SCRIPT_FILENAME] => C:/wamp/www/K2F/cms/cms-joomla-1.5/index.php
    [REMOTE_PORT] => 49947
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /K2F/cms/cms-joomla-1.5/
    [SCRIPT_NAME] => /K2F/cms/cms-joomla-1.5/index.php
    [PHP_SELF] => /K2F/cms/cms-joomla-1.5/index.php
    [REQUEST_TIME] => 1297758541
)
数组
(
[HTTP\u授权]=>
[HTTP\u主机]=>
[HTTP\u用户\u代理]=>
[HTTP_ACCEPT]=>text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
[HTTP\u ACCEPT\u LANGUAGE]=>en gb,en;q=0.5
[HTTP\u ACCEPT\u ENCODING]=>gzip,deflate
[HTTP_ACCEPT_CHARSET]=>ISO-8859-1,utf-8;q=0.7,*;q=0.7
[HTTP_KEEP_ALIVE]=>115
[HTTP\u连接]=>保持活动状态
[路径]=>
[SystemRoot]=>C:\Windows
[COMSPEC]=>C:\Windows\system32\cmd.exe
[PATHEXT]=>.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
[WINDIR]=>C:\Windows
[服务器签名]=>
[服务器软件]=>Apache/2.2.11(Win32)PHP/5.3.1
[服务器名称]=>
[服务器地址]=>
[服务器端口]=>80
[远程地址]=>
**[DOCUMENT\u ROOT]=>C:/wamp/www/
[服务器管理]=>admin@localhost
**[SCRIPT_FILENAME]=>C:/wamp/www/K2F/cms/cms-joomla-1.5/index.php
[远程_端口]=>49947
[网关接口]=>CGI/1.1
[服务器协议]=>HTTP/1.1
[请求\u方法]=>获取
[查询字符串]=>
[请求URI]=>/K2F/cms/cms-joomla-1.5/
[SCRIPT_NAME]=>/K2F/cms/cms-joomla-1.5/index.php
[PHP_SELF]=>/K2F/cms/cms-joomla-1.5/index.PHP
[请求时间]=>1297758541
)
**你们应该读出来的部分,应该很好地解释我的问题

因此,基本上,预期的
文档\u ROOT
/home/sitename/public\u html/
,但我得到的是
/usr/local/apache/htdocs

哦,如果我有点太啰嗦的话,我也很抱歉;)

编辑:

getcwd()
=>
/home/visitgoz/public\u html


\uuuuu文件
=>
/home/visitgoz/public\u html/K2F/config.php

文档根目录是每个虚拟主机的。但是使用UserDir(例如,
~sitename
)会告诉服务器在别处查找要处理的文件。如果你想让脚本正常工作,你需要处理这个差异。

我会使用
dirname(\uuuuu文件)
dirname(dirname(\uuu文件).'/../code>)
或类似的东西来创建常量
文档根目录
,然后用它来代替
$\u服务器['DOCUMENT\uu ROOT']
那些(便宜的)大众主机经常会做一些Apache URL重写技巧——这基本上让他们的生活更轻松,因为只有一个Apache V-Host,所有共享网站都有一个文档根

在这种情况下,要查找“真实”文档根,请执行以下操作:

  • 从左到右比较文档根目录和脚本文件名。如果没有匹配的路径组件,它就是这样一个共享主机
  • 如果它是这样一个共享主机,请从示例中的脚本_NAME=>“index.php”中删除请求_URI
  • 然后:从脚本末尾删除上面的结果\u FILENAME=>您的文档\u根(/home/sitename/public\u html/)
编辑(克里斯蒂安·希伯拉斯): 这是正确的答案,但它缺少代码,我必须编写代码,因此:

if(strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT'])===false){
    // how it works on reseller accounts...
    $path=str_common(getcwd(),__FILE__);
}else{
    // how it normally works...
    $path=truepath($_SERVER['DOCUMENT_ROOT']).'/';
}

我怎么知道呢?也就是说,我可以通过让我的脚本比较
DOCUMENT\u ROOT
script\u FILENAME
来了解这个问题,但是我如何才能找到真正的
DOCUMENT\u ROOT
?我不明白。。。“预期”是什么意思?为什么您希望“/home/sitename/public_html/”?我猜您可能会对在共享主机上获取“/usr/local/apache/htdocs”作为您的文档根感到困惑,但我猜这只是一个伪造的目录,b/c他们不想让您获得更多有关其目录结构的信息,我可以使用
\uuuuu FILE\uuuu
(例如)完美地找到结构。这就是我从.Hmmm获得预期路径的地方,很多脚本可能会因此而中断。你试过联系HG并通知他们这个问题吗?这是我的脚本应该解决的问题。当从
script\u NAME
中删除
REQUEST\u URI
时,不要忘记
REQUEST\u URI
可能是“/”、“/index.php”、““/?page=2”等,如果是重写的URL(
mod\u rewrite
REQUEST\u URI
无关