目前开发PHP框架并遇到了我的第一个问题。我需要能够将框架放到服务器上的任何文件夹中,无论文件夹深度多少,并且需要找到该目录以用作基本URL。
例如,如果我将框架放在服务器的根目录(http://cms.dev/)中,它当前有效,但是如果我将它放在http://cms.dev/folder/中则不起作用。
答案 0 :(得分:4)
__FILE__
是一个魔术常量,它返回当前脚本的整个路径。与dirname结合并适当添加“..”。它比getcwd
更可靠,因为它在执行期间不会改变。
然后,您可以剥离Web根目录,以获取脚本的相对路径(应映射到URL)。有许多$_SERVER
变量具有此信息。我建议使用文件系统来确定:
然后与您的基本网址结合使用。如果您的脚本的路径==
/home/public/foo_1/script.php
...和你的$ _SERVER ['DOCUMENT_ROOT'] ==
/home/public
然后,您可以将您的网址重写为/foo_1/script.php
。除非您需要,否则您不需要完全限定的URL。如果从中央位置执行此技术(如自动装载器),此技术效果最佳。
答案 1 :(得分:4)
现有四个答案,但它们似乎都处理文件路径,而您询问的是Web请求的基本URL。
根据任何网络请求,您可以在$_SERVER
中获得一堆可能有用的密钥。例如,在模拟示例中,您可能具有以下内容:
$_SERVER['REQUEST_URI'] == /folder/
$_SERVER['REQUEST_URI'] == /folder/index.php
$_SERVER['REQUEST_URI'] == /folder/index.php/some/pathinfo
$_SERVER['REQUEST_URI'] == /folder/some/modrewrite
批判性思考,如何为任何给定的子请求提取基本URL?在某些情况下,如果您知道请求的层次结构有多深,则可以查看$_SERVER['REQUEST_URI']
并删除尾随元素。 (例如,如果您的脚本是深层的两个文件夹,则删除最后两个路径元素。)当使用PATH_INFO
或mod_rewrite
时,事情变得不那么明确:提供的URL越来越长,没有明确指示路径结束和动态URL开始的位置。
这就是为什么WordPress,MediaWiki,phpBB,phpMyAdmin以及我编写的每个应用程序都让用户手动指定基本URL作为应用程序配置的一部分。
答案 2 :(得分:2)
为了让网址有效,请查看base tag:
<base href="http://cms.dev/folder/" />
如果PHP文件路径是问题,请参阅Pestilance的建议:
dirname(__FILE__) // returns the directory of current file
答案 3 :(得分:1)
在$_SERVER
数组中有很多有用的东西可供这样的东西使用。执行var_dump($_SERVER);
以查看所需阵列的哪个元素。
答案 4 :(得分:0)
要获取文件的当前路径,必须使用:
$path=getcwd();
如果在Windows中,例如C:\blah\blah\blah
没有文件名,则会返回此信息。
答案 5 :(得分:0)
听起来你正在寻找相对路径。
$_SERVER['SCRIPT_FILENAME']
应该做的伎俩。 php.net网站提供了有关http://php.net/manual/en/reserved.variables.server.php
可用内容的详细文档另外,如果你对其他的东西以及价值是什么感到好奇
<?php print_r($_SERVER); ?>
会告诉你更多你认为可以知道的事情。
答案 6 :(得分:0)
dirname(__FILE__);
basename(__FILE__);
print_r($_SERVER);
pathinfo('www/htdocs/index.html');
realpath('../../dir1/');
parse_url('http://username:password@hostname/path?arg=value#anchor');
答案 7 :(得分:0)
您正在寻找的是基于您的描述的应用程序的WEBROOT。到目前为止,已检查的答案是最接近的答案。
如Annika所提到并在评论中指出的那样,识别Web根的最简单方法是由用户定义。
但是,有些信息被忽略了:
如果您要尝试确定webroot的位置(巧合的是,它也是框架的顶层),则可以使用以下方式:
$web_only_path = dirname($_SERVER['PHP_SELF']);
这仅在正确执行重写条件的情况下才有效。
如果它们位于 htaccess 文件中,则无需费力。
但是,如果它们在apache conf文件中。然后,它们必须必须包含在用于SERVER变量的容器中,以便在处理与SEO友好URL的重定向之后存储并返回正确的信息。
答案 8 :(得分:-1)
function GetCurrentWebDir() {
$CurrentPath = substr(
$_SERVER['SCRIPT_URL'], 0,
strlen($_SERVER['SCRIPT_URL']) - strlen(
strrchr($_SERVER['SCRIPT_URL'], "\\")
)
);
$CurrentFileName = basename(__FILE__);
return substr_replace(
$CurrentPath, '', -strlen($CurrentFileName),
strlen($CurrentFileName)
);
}
echo 'current dir:'.GetCurrentWebDir();`
cp:/apps/PHP/testtesttesttesttesttesttesttesttesttesttest.php
fn:testtesttesttesttesttesttesttesttesttesttest.php
len:48
current dir:/apps/PHP/
答案 9 :(得分:-2)
使用dirname(__PATH__)
获取父目录路径。