如何使用PHP检测 abc.domain.com 或 abc.sub.domain.com 中的"abc"?



我需要检测用户是否从某个子域访问我的网站。如何检测以下示例并使用 PHP 对其进行标记?我只想检测"abc"是否是子域,仅此而已,但它必须与"abc"之后的各种其他域一起使用。

  • http://abc.domain.com/
  • http://abc.domain/
  • http://abc.sub.domain.com/

是的,它们位于"abc"子域中。

  • http://domain.com/
  • http://xyz.domain.com/
  • http://www.domain/
  • http://sub.domain.com/
  • http://xyz.sub.domain.com/

不,他们不是。

这将返回子域:

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

您可以在 $_SERVER 变量中检查HTTP_HOSTSERVER_NAME

<?php
if(strpos($_SERVER['SERVER_NAME'], 'abc.domain.com') !== false) {
    //do something
}
?>

您可以从$_SERVER超全局中访问主机名,如下所示:

$domain = $_SERVER['HTTP_HOST']

然后有多种方法可以确定此值是否以 abc 开头。 最简单的可能只是stripos

if(stripos('abc', $domain) === 0) {
    // you found it
}

请注意,在这里使用===而不是==非常重要。如果你使用了==并且子字符串在$domain中找不到,stripos将返回false== 0后,该子将在条件中计算为true

<?php
if( explode( '.', $_SERVER['SERVER_NAME'] )[0] === 'abc' ) {
    //do something
}
?>

这将分解服务器名称除以.的部分,因此它将域名的第一部分与字符串abc进行比较。

爆炸(x,x)[N] 的事情只在 PHP 5.4+ 中是可能的(或 5.3+,我记错了)。

您可以将

Web服务器配置为将所有子域重定向到单个PHP文件,您可以在其中编造错误或通过header()函数重定向用户,例如...

header('Location: http://domain.com');

另外,因为您确定由于子域而访问特定的 PHP 文件,因此您可以执行以下操作...

$url = $_SERVER['SERVER_NAME'];
list($subdomain) = explode('.', $url, 2);
$subdomain = trim(strtolower($subdomain));

然后按照您喜欢的方式使用 $subdomain 变量(例如打印它)......

echo $subdomain;

以防万一。对于 Apache 配置,您需要修改将子域重定向到 PHP 文件进行处理的VirtualHost

<VirtualHost *:80>
ServerAlias *.domain.com
DocumentRoot /website/directory/page.php
</VirtualHost>

注意

1.) 重新启动 Apache 。
2.) Apache 会警告您该目录不存在。这是真的,因为您提供的是文件路径而不是目录路径。但这将起作用。

相关内容

最新更新