试图在PHP中获取没有文件名的完整URL

时间:2010-08-30 16:33:49

标签: php

我认为这很简单,但我似乎无法找到具有我正在寻找的$_SERVER数组的变量。

假设我的网址为http://example.com/subdirectory/index.php我想获取除文件名以外的所有内容 - http://example.com/subdirectory/

我知道我可以通过一些字符串操作很容易地做到这一点,但是我想知道是否有一些我只是缺少的_server数组。我已经尝试了所有这些,看看他们给了什么,我可以得到任何东西,但我正在寻找。

7 个答案:

答案 0 :(得分:39)

没有一个,因为它不是一个有用的属性来跟踪。如果当前脚本不是index.*,那么它将不会返回当前脚本的正确URL。

但是,这可能会让你得到你想要的东西:

echo '//'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);

修改
此外,除了为Firefox安装php.net在线手动搜索工具并使用搜索关键字设置它(这将允许您通过键入类似“$_SERVER的内容来提取php $_server全局文档“进入你的URL栏”,你还应该知道var_dump()print_r()允许你输出任何变量的全部内容,包括数组和对象。这对于调试非常有用。

答案 1 :(得分:16)

在您的情况下,字符串操作是最佳解决方案。

例如:

substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/') + 1);

答案 2 :(得分:8)

没有您想要的定义变量。

您可以使用以下代码获取完整的基本网址:

// Base folder url
$myBase =  ( (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);

但希望大多数时候你不需要使用完整的东西:

// Base folder server root path
$myBase = dirname($_SERVER['PHP_SELF']);

如果您正在使用某种路线系统(mod_rewrite),请小心。

答案 3 :(得分:3)

  

我似乎无法找到具有我正在寻找的$ _SERVER数组的变量。

因为它是虚构的字符串,仅存在于浏览器的地址栏中 它的部件被发送到服务器分开。

  

我想知道是否存在_server数组的变量

这很容易知道。只是print_r($_SERVER);非常简单。

  

我知道我可以通过一些字符串操作轻松地做到这一点

耶。你必须编写的代码少于这个问题文本。

但是通过一些手动魔术,它可以简化为一个功能。

答案 4 :(得分:2)

您可以使用dirname()获取网址的路径。

答案 5 :(得分:1)

这对我来说非常有效,似乎是一个非常干净的解决方案。

$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$path = $protocol.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);

答案 6 :(得分:0)

另一种不使用 dirname 并尊重 httphttps 的解决方案是使用老式的获取路径方法 (source from this stackoverflow answer)。 然后检查路径是否以文件扩展名“.php”结尾。如果为 true,请将其从路径中删除。

长版

$current_url_path = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

if (substr($current_url_path, -4) == ".php") {
    // path ends with .php
    // split string to array
    $arr = explode("/", $current_url_path);

    // remove last array item (after the last / which is the file)
    $arrS = array_slice($arr, 0, -1);

    // join the array to a string
    $current_url_path = implode("/", $arrS);
}
echo $current_url_path;

缩短版

$current_url_path = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

$current_url_path = substr($current_url_path, -4) == ".php" ?
    implode("/", array_slice((explode("/", $current_url_path)), 0, -1)) : $current_url_path;

echo $current_url_path;

测试

此网址:http://localhost/comp-test/test.php 返回为 http://localhost/comp-test