2012-04-05 215 views
0

我使用$ _SERVER [DOCUMENT_ROOT]很多来确保我的所有链接都能正常工作。例如:

<link href="' . $_SERVER[DOCUMENT_ROOT] . '/favicon.ico" rel="icon" /> 

不要紧,那是在文件的实际路径,它总能找到相对于文档根目录的图标的正确位置。

这一切在我的网络服务器上按预期工作。但是,在我的本地开发服务器(Windows 7,Apache 2.2,虚拟主机配置)上,当它指向正确的路径(C:/ Local/MySite)时,实际上并没有发生任何事情(favicon不起作用,样式表和图像不'吨得到加载等)

有没有什么办法让$ _SERVER [DOCUMENT_ROOT]在本地工作?

我发现使用“http://”和$ _SERVER [HTTP_HOST](<link href="http://' . $_SERVER[HTTP_HOST] . '/favicon.ico" rel="icon" />)可以得到相同的预期结果,这样做有什么缺点吗?或者,我可以继续使用$ _SERVER [DOCUMENT_ROOT],只需使用服务器重写规则将其解析为可在本地运行的某些内容,并且不会影响浏览器。

回答

3

$_SERVER[DOCUMENT_ROOT]是网站根目录的整个路径,并且会出现链接和图像的壮观失败。

现在,说了这么多,你到目前为止确定的是...只有当$_SERVER[HTTP_HOST]只在使用HTTP/1.1进行连接并且客户端发出主机头时才有效。尽管如此,$_SERVER[SERVER_NAME]应该始终有效。请注意,$_SERVER[SERVER_NAME]将使用虚拟主机的主地址,因此如果服务器有别名...

+0

你的意思是说,不应该使用$ _SERVER [DOCUMENT_ROOT],不管本地与否? – 2012-04-05 14:40:49

+0

是的,不要在链接/图像中使用$ _SERVER [DOCUMENT_ROOT]。不过,它确实有其用处,例如当您使用PHP复制/移动文件时。 – Powerlord 2012-04-05 14:43:08

+2

$ _SERVER [“DOCUMENT_ROOT”]应该只用于脚本的内部(需要,包括...),但不应该**用于外部(html,图像...) – StormByte 2012-04-05 14:56:21

1

文档根目录是您的服务器上的本地路径,并且在浏览器看到的任何地方都没有任何意义您的网站。

如果你的HTML有

<img src="c:/site/html/favicon.ico" /> 

你是告诉用户的浏览器,试图从用户自己的本地驱动器加载该图标。这不但不会起作用,还会假定用户在Windows机器上。 Mac/Unix/Linux用户将不会有C:驱动器,请在自己的本地文件系统的根目录中放置一个/site/html目录树。

$_SERVER['DOCUMENT_ROOT']用于服务器内本地文件操作,例如, fopen(),file_get_contents()等等......但对于客户端操作来说基本上是毫无用处的。