4

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

例子:

在 www.mydomain.com 上安装网站

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

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

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

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

在站点 1 中安装网站:

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

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

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

在 index.php 中回显 MY_SITE_URL 应该给 www.mydomain.com/demos/site1/

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

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

在 index.php 中回显 MY_SITE_URL 应该给 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

在 index.php 中回显 MY_SITE_URL 应该给 www.mydomain.com/demos/site2/

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

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

在 index.php 中回显 MY_SITE_URL 应该给 www.mydomain.com/demos/site2/

请注意,TLD 可以更改。这意味着,在 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/

如何解决这个问题?

4

3 回答 3

0

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

$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().'/'); 

另外,您应该尝试Code-Igniter框架。该框架使这种事情变得非常容易。

于 2012-08-03T23:46:34.050 回答
0

试试这个:

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

于 2012-08-03T23:51:03.777 回答
0

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

这为您提供了安装目录:

$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';

这样您就可以在服务器端或客户端使用代码,而无需硬编码。:-)

于 2020-05-28T06:37:57.823 回答