什么是总是拥有正确的doc根字符串的好方法?

时间:2010-02-08 04:51:20

标签: php

如果我有一个菜单,如

<a href="index.php">home</a>
<a href="aboutus.php">about us</a>
<a href="contact.php">contact us</a>

在名为menu.php的文件中

这个menu.php文件包含在整个应用程序的页面中。但是,如果我创建一个新文件夹并调用它的组合,并在此文件夹中有一个名为example1.php的文件,并且menu.php包含在此文件中。家里,关于我们,并联系我们链接不再工作,因为他们指向根。所以我创建了这个功能

function getRoot() {

    $self = $_SERVER['PHP_SELF'];
    $protocol = $_SERVER['https'] == 'on' ? 'https:/' : 'http:/';
    $docroot_before = explode("/", $self);
    array_pop($docroot_before);
    $docroot_after = implode("/", $docroot_before);
    $host = $_SERVER['HTTP_HOST'];

    return  $protocol.$host.$docroot_after."/";
}

,菜单现在看起来像这样

<a href="<?=getRoot();?>index.php">home</a>
<a href="<?=getRoot();?>aboutus.php">about us</a>
<a href="<?=getRoot();?>contact.php">contact us</a>

the link should come out as  http://localhost/domain/aboutus.php (for example)
but it comes out as http://localhost:/domain/portfolio/aboutus.php (and this is wrong).

无论menu.php包含在哪里,总是获得正确的doc root的最佳方法是什么。?

2 个答案:

答案 0 :(得分:1)

如果网址以单斜杠(/)开头,则会链接到根文件夹。只要您的网页位于根文件夹中(即http://www.example.com而非http://www.example.com/foo),就可以使用以下内容:

<a href="/index.php">home</a>
<a href="/aboutus.php">about us</a>
<a href="/contact.php">contact us</a>

如果您在子域中,请将/更改为/subdomain/

答案 1 :(得分:0)

我在自制框架中使用以下内容...将它放在应用程序根文件夹中的一个文件中,然后只包含它。

define('ABSPATH', str_replace('\\', '/', dirname(__FILE__)) . '/');

$tempPath1 = explode('/', str_replace('\\', '/', dirname($_SERVER['SCRIPT_FILENAME'])));
$tempPath2 = explode('/', substr(ABSPATH, 0, -1));
$tempPath3 = explode('/', str_replace('\\', '/', dirname($_SERVER['PHP_SELF'])));

for ($i = count($tempPath2); $i < count($tempPath1); $i++)
    array_pop ($tempPath3);

$urladdr = $_SERVER['HTTP_HOST'] . implode('/', $tempPath3);

if ($urladdr{strlen($urladdr) - 1}== '/')
    define('URLADDR', 'http://' . $urladdr);
else
    define('URLADDR', 'http://' . $urladdr . '/');

unset($tempPath1, $tempPath2, $tempPath3, $urladdr);

上面的代码定义了两个常量。 ABSPATH包含应用程序根目录(本地文件系统)的绝对路径,而URLADDR包含应用程序的完全限定URL。它在mod_rewrite情况下有效。