获取当前脚本的基本目录

cdx*_*dxf 33 php

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

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

小智 33

$_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']);
Run Code Online (Sandbox Code Playgroud)

  • 实际上,如果请求URI是localhost/do /而不是localhost/do/index.php,它只返回反斜杠.我使用PHP_SELF来解决这个问题,它总是包含index.php,所以`$ current_dir_url = $ _SERVER ['SERVER_NAME'].目录名($ _ SERVER [ 'PHP_SELF']);` (3认同)

Cal*_*vin 31

尝试:

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

编辑:

$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;
Run Code Online (Sandbox Code Playgroud)

这应该回来了 localhost/do/


You*_*nse 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>";
Run Code Online (Sandbox Code Playgroud)

浏览器中的地址栏是

http://localhost/do/index.php
Run Code Online (Sandbox Code Playgroud)

输出是

Request uri is: /do/index.php
Current dir is: /do/
Run Code Online (Sandbox Code Playgroud)


icc*_*c97 8

当我实现其中一些答案时,我遇到了一些问题,因为我正在使用IIS,我也想要一个带有协议的完全限定的URL.我用PHP_SELF,而不是REQUEST_URI作为dirname('/do/')'/'(或'\'在Windows中),当你想'/do/'归还.

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


mgu*_*utt 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);
}
Run Code Online (Sandbox Code Playgroud)

为什么你不应该使用dirname()

假设您已image.jpg找到images/并且您拥有以下代码:

<img src="<?php echo $url; ?>../image.jpg" />
Run Code Online (Sandbox Code Playgroud)

现在假设$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

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

<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" />
Run Code Online (Sandbox Code Playgroud)

这就是你应该保留多个斜杠的原因.因为dirname()只删除了一些多个斜杠我打开了一个错误票.

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

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

我期待/.

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

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