如何找到应用程序的基本URL?

时间:2008-10-06 23:44:48

标签: php web-applications

我想找到我的应用程序的基本网址,因此我可以自动引用应用程序树中的其他文件...

因此,在我的应用程序的基础上给出了一个文件config.php,如果子目录中的文件包含它,则知道要为url添加前缀的内容。

application/config.php
application/admin/something.php
application/css/style.css

因此,在访问http://www.example.com/application/admin/something.php时,我希望它能够知道css文件位于$approot/css/style.css中。在这种情况下,$approot是“/application”,但我想知道应用程序是否安装在其他地方。

我不确定是否可能,许多应用程序(我认为是phpMyAdmin,Squirrelmail)必须先设置一个配置变量。如果它只是知道它会更加用户友好。

11 个答案:

答案 0 :(得分:15)

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

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情况下有效。

答案 1 :(得分:5)

您可以使用以下代码找到基本网址:

define('SITE_BASE_PATH','http://'.preg_replace('/[^a-zA-Z0-9]/i','',$_SERVER['HTTP_HOST']).'/'.str_replace('\\','/',substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT']))).'/');

简短而且最好。

答案 2 :(得分:2)

REQUEST_URI与dirname()结合使用可以告诉您当前目录,与URL路径相关:

<?php
  echo  dirname($_SERVER["REQUEST_URI"]);
?>

所以http://example.com/test/test.php打印“/ test”或http://example.com/打印“/”,您可以使用它来生成链接以引用相对于当前路径的其他页面。

编辑:刚刚在重新阅读时意识到您可能会询问磁盘路径而不是URL路径。在这种情况下,您需要PHP的getcwd()函数:

<?php
  echo  getcwd();
?>

答案 3 :(得分:1)

除非你自己跟踪,否则我不相信这会有一个定义。或者更确切地说,您要求PHP跟踪您有些随意定义的内容。

它的长短是,如果我正确地理解你的问题,我不相信你所要求的存在,至少不是“核心”PHP;给定的框架可以提供相对于理解的目录结构的“根”URL。

这有意义吗?

答案 4 :(得分:1)

将它放在你的config.php中(在你的应用程序的root目录中):

$approot = substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT']));

我认为那样做。

答案 5 :(得分:1)

可以找到应用程序的url根目录

$protocol = (strstr('https',$_SERVER['SERVER_PROTOCOL']) === false)?'http':'https';
$url = $protocol.'://'.$_SERVER['SERVER_NAME'].dirname($_SERVER['REQUEST_URI']);

此代码将返回任何应用程序的url路径,无论是在线还是在脱机服务器上。

我没有正确检查'/'。请将其修改为斜杠。

此文件应放在root中。

示例: 如果 申请网址:

http://localhost/test/test/test.php

然后此代码将返回

http://localhost/test/test

由于

答案 6 :(得分:0)

一种解决方案是为所有内容使用相对路径,这样安装应用程序的位置无关紧要。例如,要访问样式表,请使用:

../css/style.css

答案 7 :(得分:0)

如果您想要文件系统上的路径,可以使用$_SERVER['DOCUMENT_ROOT']
如果您只想要在域名$_SERVER['REQUEST_URI']

之后显示在网址中的文件路径

答案 8 :(得分:0)

我从来没有找到办法让它成功。

我总是最终设置一个配置变量,其服务器路径为web根目录以上的一个级别。那就是:

  • $ configVar。 'public / whatever /'为root内的东西,
  • 但你也可以在外面加上$ configVar。 'phpInc / db.inc.php /'等。

答案 9 :(得分:0)

在我部署的任何地方,无论是否有重写规则,这对我来说都很有魅力:

$ baseDir ='http://'.$_SERVER ['HTTP_HOST']。(dirname($ _SERVER ['SCRIPT_NAME'])!='/'?dirname($ _ SERVER [“SCRIPT_NAME”])。' /':'/');

答案 10 :(得分:0)

这是我在我的应用程序中使用的工作正常,我也使用自定义端口,所以我也必须允许这样做。

define('DOC_URL', ($_SERVER['HTTPS']=='on'?'https':'http').'://'.$_SERVER['SERVER_NAME'].(!in_array($_SERVER['SERVER_PORT'], array(80,443))?':'.$_SERVER['SERVER_PORT']:'')).dirname($_SERVER['REQUEST_URI']);

然后我输入以下内容使用它......

<img src="<?php echo DOC_URL; ?>/_img/logo.png" />