获取当前脚本的基本目录

时间:2010-08-07 05:40:09

标签: php

这是我的脚本的网址:localhost/do/index.php

我想要一个返回localhost/do的变量或函数(类似于$_SERVER['SERVER_NAME'].'/do'

11 个答案:

答案 0 :(得分:33)

$_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']);

答案 1 :(得分:31)

尝试:

$url = $_SERVER['REQUEST_URI']; //returns the current URL
$parts = explode('/',$url);
print_r($parts);

编辑:

$url = $_SERVER['REQUEST_URI']; //returns the current URL
$parts = explode('/',$url);
$dir = $_SERVER['SERVER_NAME'];
for ($i = 0; $i < count($parts) - 1; $i++) {
 $dir .= $parts[$i] . "/";
}
echo $dir;

这应该返回localhost/do/

答案 2 :(得分:8)

php有许多用于字符串解析的函数,可以使用简单的单行代码片段来完成 dirname()(你要求的)和parse_url()(你需要的)就在其中

<?php

echo "Request uri is: ".$_SERVER['REQUEST_URI'];
echo "<br>";

$curdir = dirname($_SERVER['REQUEST_URI'])."/";

echo "Current dir is: ".$curdir;
echo "<br>";

浏览器中的地址栏

http://localhost/do/index.php

输出

Request uri is: /do/index.php
Current dir is: /do/

答案 3 :(得分:8)

当我实现其中一些答案时,我遇到了一些问题,因为我正在使用IIS,我也想要一个带有协议的完全限定的URL。当您希望返回PHP_SELF时,我使用REQUEST_URI代替dirname('/do/'),因为'/'在Windows中提供了'\'(或'/do/'}。 / p>

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {
    $protocol = 'http://';
} else {
    $protocol = 'https://';
}
$base_url = $protocol . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']);

答案 4 :(得分:8)

我建议不要使用dirname()。我有几个问题有多个斜线和意外的结果。这就是我创建currentdir()的原因:

function currentdir($url) {
    // note: anything without a scheme ("example.com", "example.com:80/", etc.) is a folder
    // remove query (protection against "?url=http://example.com/")
    if ($first_query = strpos($url, '?')) $url = substr($url, 0, $first_query);
    // remove fragment (protection against "#http://example.com/")
    if ($first_fragment = strpos($url, '#')) $url = substr($url, 0, $first_fragment);
    // folder only
    $last_slash = strrpos($url, '/');
    if (!$last_slash) {
        return '/';
    }
    // add ending slash to "http://example.com"
    if (($first_colon = strpos($url, '://')) !== false && $first_colon + 2 == $last_slash) {
        return $url . '/';
    }
    return substr($url, 0, $last_slash + 1);
}

为什么不应该使用dirname()

假设您image.jpg位于images/,并且您拥有以下代码:

<img src="<?php echo $url; ?>../image.jpg" />

现在假设$url可以包含不同的值:

  • http://example.com/index.php
  • http://example.com/images/
  • http://example.com/images//
  • http://example.com/

无论它包含什么,我们都需要当前目录来生成有效的深层链接。您尝试dirname()并遇到以下问题:

1.)文件和目录的结果不同

文件
dirname('http://example.com/images/index.php')返回http://example.com/images

目录
dirname('http://example.com/images/')返回http://example.com

但没问题。我们可以通过一个技巧来解决这个问题:
dirname('http://example.com/images/' . '&') . '/'返回http://example.com/images/

现在dirname()在两种情况下都返回所需的当前目录。但我们还有其他问题:

2.。)删除一些多个斜杠
dirname('http://example.com//images//index.php')返回http://example.com//images

当然这个网址不是很好,但是会发生多个斜线,我们需要像浏览器一样使用它们来验证它们的输出。也许你想知道,但以下示例的前三个图像都已加载。

<img src="http://example.com/images//../image.jpg" />
<img src="http://example.com/images//image.jpg" />
<img src="http://example.com/images/image.jpg" />
<img src="http://example.com/images/../image.jpg" />

这就是你应该保留多个斜杠的原因。由于dirname()只删除了多个斜杠,因此我打开了bug ticket

3.。根URL不返回根目录
dirname('http://example.com')返回http:
dirname('http://example.com/')返回http:

4.。)根目录返回相对路径
dirname('foo/bar')返回.

我希望/

5.。编码错误的网址
dirname('foo/bar?url=http://example.com')返回foo/bar?url=http:

所有测试结果:
http://www.programmierer-forum.de/aktuelles-verzeichnis-alternative-zu-dirname-t350590.htm#4329444

答案 5 :(得分:2)

如果您想要包含服务器名称,正如我所理解的那样,那么以下代码片段应该满足您的要求:

$result = $_SERVER['SERVER_NAME'] . dirname(__FILE__);

$result = $_SERVER['SERVER_NAME'] . __DIR__; // PHP 5.3

$result = $_SERVER['SERVER_NAME'] . '/' . dirname($_SERVER['REQUEST_URI']);

答案 6 :(得分:1)

dirname将为您提供文件路径的目录部分。例如:

echo dirname('/path/to/file.txt');  // Outputs "/path/to"

获取当前脚本的URL有点棘手,但$_SERVER['REQUEST_URI']会返回域名后面的部分(即它会给你“/do/index.php”)。

答案 7 :(得分:1)

最好的方法是使用explode / implode函数(内置PHP),如此

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$parts = explode('/',$actual_link);
$parts[count($parts) - 1] = "";
$actual_link = implode('/',$parts);
echo $actual_link;

答案 8 :(得分:0)

我的建议:

const DELIMITER_URL = '/';
$urlTop = explode(DELIMITER_URL, trim(input_filter(INPUT_SERVER,'REQUEST_URI'), DELIMITER_URL))[0]

测试:

const DELIMITER_URL = '/';
$testURL = "/top-dir";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/test";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/test/";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/test/this.html";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/test.html";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

测试输出:

string(7) "top-dir"
string(7) "top-dir"
string(7) "top-dir"
string(7) "top-dir"
string(7) "top-dir"
string(7) "top-dir"

答案 9 :(得分:0)

保持尾随斜杠的更短(且正确)的解决方案:

$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$url_dir = preg_replace('/[^\/]+\.php(\?.*)?$/i', '', $url);
echo $url_dir;

答案 10 :(得分:0)

我的贡献
经过测试和工作

authRequest

用法
示例1:
    /** * Get Directory URL */ function get_directory_url($file = null) { $protocolizedURL = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $trailingslashURL= preg_replace('/[^\/]+\.php(\?.*)?$/i', '', $protocolizedURL); return $trailingslashURL.str_replace($_SERVER['DOCUMENT_ROOT'], '', $file); }
这将返回<?php echo get_directory_ur('images/monkey.png'); ?>

示例2:
http://localhost/go/images/monkey.png
这将返回<?php echo get_directory_ur(); ?>