这是我的脚本的网址: localhost/do/index.php
我想要一个变量或一个返回的函数localhost/do(类似的东西$_SERVER['SERVER_NAME'].'/do')
小智 33
$_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']);
Run Code Online (Sandbox Code Playgroud)
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/
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)
当我实现其中一些答案时,我遇到了一些问题,因为我正在使用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)
我建议不要用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.phphttp://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