2

我正在构建一个应用程序,该应用程序使用位于数据库中的用户子域和自定义域名,因此如果请求来自另一个域,我将从数据库中检查该自定义 URL 是否确实存在或请求来自一个子域,我会检查它是否存在。如果是我做我的事。

考虑一下我正在寻找的一个简单示例:

if(is_user_request())
{
    $url = get_url();
    // assuming that get_url() magically decides whether to output ..
    // a custom domain (http://domain.tld)
    // or a subdomain's first part (eg. "this".domain.tld)
}
else
{
    // otherwise it's not a sub domain nor a custom domain,
    // so we're dealing with our own main site.
}

现在在你继续假设因为我有 0 代表之前,我在这里要求“teh 代码”。我有一种完全可行的方法,如下所示:

// hosts
$hosts = explode('.', $_SERVER['HTTP_HOST']);

// if there is a subdomain and that's under our $sitename
if(!empty($hosts[1]) AND $hosts[1] === Config::get('domain_mid_name'))
{
    $url = $hosts[0];
    $url_custom = false;
}

 // if there is no subdomain, but the domain is our $sitename
 elseif(!empty($hosts[0]) AND $hosts[0] === Config::get('domain_mid_name') AND !empty($hosts[1]) AND $hosts[1] !== Config::get('domain_mid_name'))
    {
    $url = false;
    $url_custom = false;
}

// otherwise it's most likely that the request
// came from a entirely different domain name.
// which means it's probably $custom_site
else
{
    $url = false;
    $url_custom = implode('.', $hosts);
}

if($url)
{
    return $url;
}

if($url_custom)
{
    return $url_custom;
}

但是,我确信有更好的方法可以做到这一点。因为首先,HTTP_HOST 不包含'http://',所以我需要手动添加它,我很确定这整个 if,否则事情只是一个矫枉过正。所以,比我聪明的人,请赐教。

哦,不……我没有预定义的子域。我设置了一个简单的通配符 *.domain.tld,因此所有子域都转到主脚本。我之所以这么说,是因为在我寻找解决方案的过程中,我发现了许多建议手动创建子域的答案,这甚至与我所要求的内容无关,所以让我们跳过这个主题。

4

2 回答 2

3

$_SERVER['HTTP_HOST']除非您想将不同的参数从 Web 服务器传递到 PHP,否则这是正确的方法。

至于协议,请注意请求协议应该由$_SERVER['HTTPS']而不是假设它是http.

对于提取子域,您可以查看使用array_shift然后运行

$subdomain = array_shift(explode('.', $_SERVER['HTTP_HOST']));

但通常你所拥有的是应该如何去做。

于 2013-03-28T20:17:27.427 回答
2

正如已经说过的,$_SERVER['HTTP_HOST']是要走的路。

但是您的代码中有错误。您假设发送的主机名包含 2 或 3 个组件,但您不能确定这一点。你至少count($hosts)也应该检查一下。

例如,如果您将 domain.tld 用于您自己的网站,那么您最好先检查是否domain.tld已发送(快速返回您的页面);然后看看是否substr($_SERVER['HTTP_HOST']...,-11)==='.domain.tld',如果是,返回子站点(适用于任何级别的子域,仍然很快);否则错误恢复,因为已将一个完全陌生的域路由给您。需要注意的关键是从层次结构顶部进行域匹配意味着匹配主机名字符串右对齐:

        .domain.tld | subsite-pattern
   sub12.domain.tld | MATCH
   sub12.dumain.tld | NO MATCH
    sub12domain.tld | NO MATCH
于 2013-03-28T20:41:26.993 回答