PHP奇怪的DOCUMENT_ROOT [英] PHP strange DOCUMENT_ROOT
问题描述
因此,基本上,我正在编写一个框架,并且作为其功能的一部分,它应该为最终开发人员提供一套完善的URI/路径.
So basically, I'm writing a framework, and as part of it features, it's supposed to provide a set of well-established URIs/paths to the end-developer.
其中一些路径使用$_SERVER['DOCUMENT_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上大部分时间工作,实际上在VPS上是无缝的.
The code has been fine-tuned to work on both Linux and Windows. Apparently, it works most of the time on Linux, quite seamless in fact on VPSes.
但是,最近,我在 HG经销商帐户(共享主机)上进行了尝试一切都破裂了. 我已经在有问题的计算机上的$ _SERVER内部打印了数据:
However, as of late, I tried it on an HG Reseller Account (shared hosting) and it all broke up. I've printed out data inside $_SERVER on the problematic machine:
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
)
还有我的机器:
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
)
**您应该阅读的部分,应该可以完美地解释我的问题.
** Parts you ought to read out, should explain my problem perfectly.
所以基本上,期望的DOCUMENT_ROOT
是/home/sitename/public_html/
,但是我却得到了/usr/local/apache/htdocs
.
So basically, the expected DOCUMENT_ROOT
is /home/sitename/public_html/
, but instead I got /usr/local/apache/htdocs
.
哦,对不起,如果我太冗长了;)
Oh, and sorry if I've been a bit too verbose ;)
getcwd()
=> /home/visitgoz/public_html
__FILE__
=> /home/visitgoz/public_html/K2F/config.php
推荐答案
那些(便宜的)Mass Hoster经常会执行一些Apache URL重写技巧-基本上使THEIR Life更加轻松,因为只有一个Apache V-Host,所有共享网站都使用一个文档根目录.
Those (cheap) Mass-Hosters quite often do some Apache URL-Rewriting tricks - which basically make THEIR Life easier, since there's only ONE Apache V-Host, with ONE Document-Root for all shared Websites.
在这种情况下要找到真实的"文档根目录:
To find the "real" document Root in this case:
- 从左到右比较DOCUMENT_ROOT和SCRIPT_FILENAME.如果没有匹配的Path-Components,那就是共享主机.
- 如果是这样的共享主机,请在您的示例中从SCRIPT_NAME =>"index.php"中删除REQUEST_URI.
- 然后:从SCRIPT_FILENAME =>您的DOCUMENT_ROOT(/home/sitename/public_html/)的末尾从上方删除结果
编辑(Christian Sciberras): 这是正确的答案,但是它缺少我必须编写的代码,所以去了:
Edit (Christian Sciberras): This is the right answer, but it lacks code, which I had to write anyway, so here goes:
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']).'/';
}
这篇关于PHP奇怪的DOCUMENT_ROOT的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!