返回PHP中的当前Web路径

时间:2010-03-11 19:39:32

标签: php frameworks

目前开发PHP框架并遇到了我的第一个问题。我需要能够将框架放到服务器上的任何文件夹中,无论文件夹深度多少,并且需要找到该目录以用作基本URL。

例如,如果我将框架放在服务器的根目录(http://cms.dev/)中,它当前有效,但是如果我将它放在http://cms.dev/folder/中则不起作用。

10 个答案:

答案 0 :(得分:4)

__FILE__是一个魔术常量,它返回当前脚本的整个路径。与dirname结合并适当添加“..”。它比getcwd更可靠,因为它在执行期间不会改变。

然后,您可以剥离Web根目录,以获取脚本的相对路径(应映射到URL)。有许多$_SERVER变量具有此信息。我建议使用文件系统来确定:

  1. 如果您的脚本可公开访问?
  2. 在哪个深度/网址前缀?
  3. 然后与您的基本网址结合使用。如果您的脚本的路径== /home/public/foo_1/script.php ...和你的$ _SERVER ['DOCUMENT_ROOT'] == /home/public

    然后,您可以将您的网址重写为/foo_1/script.php。除非您需要,否则您不需要完全限定的URL。如果从中央位置执行此技术(如自动装载器),此技术效果最佳。

答案 1 :(得分:4)

现有四个答案,但它们似乎都处理文件路径,而您询问的是Web请求的基本URL。

根据任何网络请求,您可以在$_SERVER中获得一堆可能有用的密钥。例如,在模拟示例中,您可能具有以下内容:

批判性思考,如何为任何给定的子请求提取基本URL?在某些情况下,如果您知道请求的层次结构有多深,则可以查看$_SERVER['REQUEST_URI']并删除尾随元素。 (例如,如果您的脚本是深层的两个文件夹,则删除最后两个路径元素。)当使用PATH_INFOmod_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的重定向之后存储并返回正确的信息。

请参阅:SCRIPT_NAME and PHP_SELF with mod_rewrite in .conf

答案 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__)获取父目录路径。