PHP 动态获取站点网址


PHP Get siteurl dynamically

我正在尝试在不进行硬编码的情况下获取 siteurl 并将其存储在配置文件内的常量中,以便我可以在我的脚本中使用它,而不管嵌套/嵌套文件夹如何。此配置文件存储在网站主安装目录中的文件夹中。

例:

在 www.mydomain.com 上安装网站

配置文件位于 www.mydomain.com/my_folder/configuration.php

希望在 configuration.php 文件中声明一个常量,以便它始终动态获取已安装的路径,而无需对其进行硬编码。所以define("MY_SITE_URL", ???? )

上面代码中的????应该用什么来代替,这样即使我的主网站安装在嵌套文件夹中,它也能正常工作?

示例:所有页面都将包含相同的配置.php在文件开头作为要求

在站点 1 中安装网站:

网站根目录:www.mydomain.com/demos/site1/

配置位置:www.mydomain.com/demos/site1/my_folder/configuration.php

子文件夹:www.mydomain.com/demos/site1/1/index.php

呼应索引中的MY_SITE_URL.php应该给出 www.mydomain.com/demos/site1/

子文件夹:www.mydomain.com/demos/site1/1/2/index.php

配置位置:www.mydomain.com/demos/site1/my_folder/configuration.php

呼应索引中的MY_SITE_URL.php应该给出 www.mydomain.com/demos/site1/

在站点 2 中安装网站:

网站根目录:www.mydomain.com/demos/site2/

配置位置:www.mydomain.com/demos/site2/my_folder/configuration.php

子文件夹:www.mydomain.com/demos/site2/1/index.php

在索引中呼应MY_SITE_URL.php应该给出 www.mydomain.com/demos/site2/

子文件夹:www.mydomain.com/demos/site2/1/2/index.php

配置位置:www.mydomain.com/demos/site2/my_folder/configuration.php

在索引中呼应MY_SITE_URL.php应该给出 www.mydomain.com/demos/site2/

请注意,顶级域名可能会更改。这意味着,在 www.mydomain.tk、www.mydomai.org、www.mydomain.net、www.mydomain.co.ca 等上安装网站不应该使代码变得无用。

到目前为止,我拥有的:

我试图整理一个脚本。我几乎到了那里,但不是 100%。在这里:

function domain_url()
{
    $pageURL = 'http';
    if(isset($_SERVER["HTTPS"]))
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") 
    {
        $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    } 
    else 
    {
        $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    //Remove any GET params from url
    $remmove_get = strtok($pageURL, '?');
    //Removes trailing slash only at the end of string. This slash is received only when accessing a page within sub folders.
    $pageURL = preg_replace('{/$}', '', $remmove_get);
    //Remove page name
    $pageURL = dirname($pageURL);
    return $pageURL;
}
define("MY_SITE_URL", domain_url().'/'); 

我当前代码的问题:

在 www.mydomain.com/demos/site1/上运行代码,www.mydomain.com/demos/site1/1/会MY_SITE_URL www.mydomain.com/demos/site1/,这是正确的。

但是当我在 www.mydomain.com/demos/site1/1/2/index.php 上运行代码时,回显MY_SITE_URL给了我 www.mydomain.com/demos/site1/1/,而实际上我想要:www.mydomain.com/demos/site1/

如何解决这个问题?

如果你总是想要第二个目录,那么你可以使用

$boom = explode("/", $_SERVER['REQUEST_URI']);
$domain_url = $_SERVER["SERVER_NAME"].'/'.$boom[1].'/'.$boom[2];
echo $domain_url;

如果站点不在第二个目录中,您可以使用:(此代码应该更简洁一些(。只需将 site1 替换为站点的名称

$site_search = "site1";
$url = $_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI'];
$domain_url = substr($url, 0, strpos($url, $site_search)+strlen($site_search));;
echo $domain_url;   

更新这将获取/my_folder 之前所有内容的 url

$domain_url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$domain_url = substr($url, 0, strpos($url, '/my_folder'));
define("MY_SITE_URL", domain_url().'/'); 

顺便提一下,你应该尝试使用代码点火器框架。该框架使这种事情变得非常容易。

试试这个:

define('PROTOCOL', array_key_exists('HTTPS', $_SERVER) && $_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://');
define('DOMAIN', $_SERVER['HTTP_HOST']);
define('FOLDER', (dirname($_SERVER['SCRIPT_NAME']) == '/' ? null : dirname($_SERVER['SCRIPT_NAME'])) . '/');
define('BASE_URL', PROTOCOL . DOMAIN . dirname(FOLDER));

这 4 个常量应该涵盖您正在寻找的内容。我在这篇文章中写了更多关于这个的内容 - http://bit.ly/MPls0E

虽然我知道这是一个非常古老的帖子,但它让我开始朝着答案的方向前进。 这是我的结果。我希望这对将来的某人有所帮助。

这为您提供了安装目录:

$path = 'FindMe.locate';
while(! realpath($path)){
$path = '../' . $path;
}
define('DIR_FS_ROOT', dirname(realpath($path)) . '/');

对于网址,我只是使用:

define('HTTP_ROOT', 'http://' . $_SERVER["SERVER_NAME"] . ':8080/');

这给了我基本目录,然后我只需添加我正在寻找的任何文件。

echo HTTP_ROOT . 'images/logo.png';
echo DIR_FS_ROOT . 'images/logo.png';

这样,您就可以在服务器端或客户端使用代码,而不必对其进行硬编码。