在PHP中解析主机+子目录url

时间:2013-05-01 22:15:26

标签: php

我想要的是能够获取特定站点的主机和子文件夹。例如: 从http://example:81/test/获取http://example:81/test/pagename.php

它也应该使用相同的网址http://example:81/test/以及多个级别的子文件夹,例如http://example:81/test/test2/somepage.php

它不应该在文件夹本身中获取文件的结构,例如http://example:81/test/images/page.php应该仍然是http://example:81/test/而不是http://example:81/test/images/

我尝试使用

$_SERVER['HTTP_HOST'] // only provides example:81
$_SERVER['REQUEST_URI'] // provides full path example:81/test/images/

基本上我想得到的是index.php文件的url,即使它位于子文件夹中。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:3)

您可能需要构建自己的字符串才能获得完整的网址。

<?php
$url = 'http'.(isset($_SERVER['HTTPS'])?'s':'').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

如果您需要详细信息,可以使用parse_url()

<?php
$details = parse_url($url);
print_r($details);

会输出类似的内容:

Array
(
    [scheme] => http
    [host] => example.com
    [port] => 81
    [path] => /test/test2/
    [query] => somepage.php
)

编辑:

如果您想要文件的路径,可以使用$_SERVER['PHP_SCRIPT']获取相对于文档根目录的被调用脚本的文件名或$_SERVER['SCRIPT_FILENAME']以获取包含文档根目录的服务器路径。还有内置常量__DIR____FILE__,它们具有直到当前脚本的服务器路径,即使包含在内也是如此。所有这些都可以与dirname()一起使用以获取变量的目录,并使用basename()来获取文件名。还有$_SERVER['DOCUMENT_ROOT']具有通向Web根目录的路径。

因此,要在此脚本所在的同一目录下获取路径,如果调用脚本/var/www/test/index.php,则可以使用dirname(__FILE__).'/some/sub/dir/'

您可以通过执行$_SERVER的print_r来查看所有服务器变量,或者甚至可以更好地调用phpinfo()以获得所有已定义的php模块和变量的良好输出。

答案 1 :(得分:0)

我在我的一个项目中遇到了类似的问题;我希望能够通过脚本文件名获取subfolder(等等 index.php ) 我尝试了一些方法,但以下(丑陋)方法有效。 诀窍是“使用所有.php文件可能存在的所有”位置“提供”方法。

如果在其中一个地方找到script name,则subtract部分 LEFT 那些地方;这部分应该是subfolder(如果有的话)。

是的,它丑陋但为我工作......

$string = $_SERVER["SCRIPT_NAME"];
$subfolder = NULL;
// tries to find the 'subfolder' by checking all possible PHP calls
$places = array("/","plugins/","system/php");
foreach($places as $key=>$val) {
   $pos = strpos($string,$val);
   if ($pos !== FALSE && !isset($subfolder)) {
     $subfolder = substr($string,0,$pos-1);
     break;
   }
}