17

我正在使用:

$domain = $_SERVER['HTTP_HOST'];
$path = $_SERVER['SCRIPT_NAME'];
$themeurl = $domain . $path;

但这当然给出了完整的 URL。相反,我需要完整的 URL 减去当前文件和一个目录并减去尾部斜杠

因此,无论浏览器 URL 域是什么,例如 localhost、https://、http:// 等,父目录的完整真实(绕过任何 mod 重写)URL 路径都没有尾部斜杠。

这是怎么做到的?安全,所以没有 XSS,因为我猜(从阅读中)使用除“SCRIPT_NAME”之外的任何东西都有这样的风险.. 虽然不确定.. 只是读了很多试图弄清楚这一点。

示例:如果给出:

https://stackoverflow.com/questions/somequestions/index.php

需要:

https://stackoverflow.com/questions

没有尾部斜杠。

并且还应该适用于:

http://localhost/GetSimple/admin/load.php

要得到

http://localhost/GetSimple

这就是我想要做的。

谢谢你。



编辑: 这是我使用的工作解决方案:

$url  = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['SERVER_NAME'];
$url .= htmlspecialchars($_SERVER['REQUEST_URI']);
$themeurl = dirname(dirname($url)) . "/theme";

它完美地工作。

4

7 回答 7

35

这很容易 - 使用该功能dirname两次 :)

echo dirname(dirname('https://stackoverflow.com/questions/somequestions/index.php'));

另请注意@Sid 的评论。当您需要当前脚本的完整 uri 时,使用协议和服务器使用如下内容:

$url  = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['SERVER_NAME'];
$url .= $_SERVER['REQUEST_URI'];

echo dirname(dirname($url));
于 2013-02-27T11:03:19.007 回答
2

我有更简单的语法来获取带有端口和 url 的父地址让我们试试我的代码

dirname($_SERVER['PHP_SELF'])

使用此代码,如果您想 2x 回滚目录,您可以获得 adres 的直接父级,您可以循环

dirname(dirname($_SERVER['PHP_SELF']))

dirname 是获取父地址网络的功能, $_SERVER['PHP_SELF'] 可以显示当前地址网络。

谢谢先生https://stackoverflow.com/users/171318/hek2mgl

于 2014-04-26T04:28:21.463 回答
2

我不建议将dirname()其用于目录而不是用于 URI。例子:

  • dirname("http://example.com/foo/index.php")返回http://example.com/foo
  • dirname("http://example.com/foo/")返回http://example.com
  • dirname("http://example.com/")返回http:
  • dirname("http://example.com")返回http:

所以你必须非常小心$_SERVER你使用哪个 var,当然它只适用于这个特定的问题。一个更好的通用解决方案是使用currentdir()在此基础上您可以使用它来获取父目录:

function parentdir($url) {
    // note: parent of "/" is "/" and parent of "http://example.com" is "http://example.com/"
    // remove filename and query
    $url = currentdir($url);
    // get parent
    $len = strlen($url);
    return currentdir(substr($url, 0, $len && $url[ $len - 1 ] == '/' ? -1 : $len));
}

例子:

  • parentdir("http://example.com/foo/bar/index.php")返回 http://example.com/foo/
  • parentdir("http://example.com/foo/index.php")返回http://example.com/
  • parentdir("http://example.com/foo/")返回http://example.com/
  • parentdir("http://example.com/")返回http://example.com/
  • parentdir("http://example.com")返回http://example.com/

所以你会有更稳定的结果。也许您可以解释为什么要删除尾部斜杠。我的经验是,它会产生更多问题,因为您无法区分名为“/foo”的文件和不使用is_dir(). 但是,如果这对您很重要,您可以删除最后一个 char

于 2015-04-01T20:52:19.227 回答
1

此示例适用于端口

function full_url($s)
{
    $ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
    $sp = strtolower($s['SERVER_PROTOCOL']);
    $protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
    $port = $s['SERVER_PORT'];
    $port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
    $host = isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : $s['SERVER_NAME'];
    return $protocol . '://' . $host . $port . $s['REQUEST_URI'];
}
$themeurl = dirname(dirname(full_url($_SERVER))).'/theme';
echo '<a href="'.htmlspecialchars($themeurl,ENT_QUOTES,'UTF-8').'">Theme URL</a>';

来源:https ://stackoverflow.com/a/8891890/175071

于 2013-12-06T10:26:09.307 回答
0

我和 hek2mgl 在一起。但是,万一脚本并不总是低于目标的 2 个目录,您可以使用explode:

$parts = explode("/",ltrim($_SERVER['SCRIPT_NAME'],"/"));
echo $_SERVER['HTTP_HOST'] . "/" . $parts[0];
于 2013-02-27T11:09:11.327 回答
0

正如 hek2mgl 所提到的,这是正确的,而且更动态的方法是dirname(dirname(htmlspecialchars($_SERVER['REQUEST_URI'])));.

编辑:

$_SERVER['REQUEST_URI'] 将省略域名。参考@hek2mgl 的帖子,你可以echo dirname(dirname(htmlspecialchars($url)));

于 2013-02-27T11:09:11.560 回答
-2

以下是获取所需路径的有用命令:

(例如,您在http://yoursite.com/folder1/folder2/file.php中执行)

__FILE__   (on L.Hosting)   === /home/xfiddlec/http_docs/folder1/folder2/yourfile.php
__FILE__   (on Localhost) === C:\wamp\www\folder1\folder2\yourfile.php 
$_SERVER['HTTP_HOST']     === www.yoursite.com (or without WWW)   
$_SERVER["PHP_SELF"]      === /folder1/folder2/yourfile.php
$_SERVER["REQUEST_URI"]   === /folder1/folder2/yourfile.php?var=blabla
$_SERVER["DOCUMENT_ROOT"] === /home/xfiddlec/http_docs

// BASENAME and DIRNAME (lets say,when __file__ is '/folder1/folder2/yourfile.php'
basename(__FILE__)  ==== yourfile.php
dirname(__FILE__)   ==== /folder1/folder2

例子:

*首页网址             ( yoursite.com )

<?php echo $_SERVER['HTTP_HOST'];?>

*文件的基本网址     ( yoursite.com/anyfolder/myfile.php )

<?php echo $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; ?>

*完成当前网址( yoursite.com/anyfolder/myfile.php?action=blabla )

<?php echo $_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];?>

*当前文件夹的 URL( yoursite.com/anyfolder/ )

<?php echo $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']);  ?>

*获取文件的 RealPath(即使它包含在内)(将 /var/public_html 更改为您想要的根目录)

<?php
$cur_file=str_replace('\\','/',__FILE__); //Then Remove the root path::
$cur_file=preg_replace('/(.*?)\/var\/public_html/','',$cur_file);
?>

psfor wordpress,已经存在预定义的函数来获取插件或主题 url。

i.e. get plugin folder ( http://yoursite.com/wp-content/plugins/pluginName/ )
<?php echo plugin_dir_url( __FILE__ );?>
于 2014-02-17T07:57:39.147 回答