Php 检测请求是否来自不同域或子域的最佳方法

Php 检测请求是否来自不同域或子域的最佳方法,php,Php,我正在构建一个应用程序,它使用子域和用户数据库中的自定义域名,因此,如果请求来自另一个域,我将从数据库中检查该自定义url是否确实存在,或者当请求来自子域时,我将检查是否存在。如果是的话,我做我的事 这是我正在寻找的一个简单的例子: if(is_user_request()) { $url = get_url(); // assuming that get_url() magically decides whether to output .. // a custom d

我正在构建一个应用程序,它使用子域和用户数据库中的自定义域名,因此,如果请求来自另一个域,我将从数据库中检查该自定义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_主机不包含“HTTP://”,所以我需要手动添加它,我很确定整个if,else的事情只是一个过火的行为。所以,比我聪明的人,请启发我


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

$\u SERVER['HTTP\u HOST']
是正确的方法,除非您希望将不同的参数从web服务器传递到PHP中

至于协议,请注意,请求协议应由
$\u服务器['HTTPS']
确定,而不是假定它是
http

对于提取子域,您可以使用并运行

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

但一般来说,您所拥有的是应该如何做。

正如前面所说的,
$\u服务器['HTTP\u主机]]
是一种方法

但是代码中有错误。您假设发送的主机名由2或3个组件组成,但您不能确定这一点。您至少还应该检查
计数($hosts)

举例来说,如果您在自己的站点上使用domain.tld,那么最好先检查是否发送了
domain.tld
(快速返回页面);然后查看substr($\u SERVER['HTTP\u HOST']…,-11)=='.domain.tld',如果是,则返回子网站(适用于任何级别的子域,仍然快速);else错误恢复,因为已将完全外来的域路由到您。需要注意的关键是,层次结构顶部的域匹配意味着匹配右对齐的主机名字符串:

        .domain.tld | subsite-pattern
   sub12.domain.tld | MATCH
   sub12.dumain.tld | NO MATCH
    sub12domain.tld | NO MATCH

这是一个更好的答案。请注意速度,我们也非常感谢。