我正在尝试从 HTTP_HOST 值中提取子域。但是我偶然发现了一个问题,如果子域中有多个点,则无法正确匹配。鉴于这是一个在多个不同域上运行的脚本,并且它可以有无限数量的点,并且 tld 可以是 1 或 2 部分(以及任何长度) - 是否有正确匹配子域的实用方法,域和所有情况下的tld?
因此,例如采用以下 HTTP_HOST 值以及需要匹配的值。
- www.buggedcom.co.uk
- 子域名:www
- 域名:buggedcom.co.uk
- 顶级域名:co.uk
- www.buggedcom.com
- 子域名:www
- 域名:buggedcom.com
- 顶级域名:com
- test.buggedcom.co.uk
- 子域:测试
- 域名:buggedcom.co.uk
- 顶级域名:co.uk
- test.buggedcom.com
- 子域:测试
- 域名:buggedcom.com
- 顶级域名:com
- multi.sub.test.buggedcom.co.uk
- 子域:multi.sub.test
- 域名:buggedcom.co.uk
- 顶级域名:co.uk
- multi.sub.test.buggedcom.com
- 子域:multi.sub.test
- 域名:buggedcom.com
- 顶级域名:com
我假设完成此操作的唯一方法是加载 tld 列表,这可能让我真的不想这样做,因为这是在脚本的开头,并且确实需要像那样繁重的工作。
以下是当前代码。
define('HOST', isset($_SERVER['HTTP_HOST']) === true ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_ADDR']) === true ? $_SERVER['SERVER_ADDR'] : $_SERVER['SERVER_NAME']));
$domain_parts = explode('.', HOST);
$domain_parts_count = count($domain_parts);
if($domain_parts_count > 1)
{
$sub_parts = array_splice($domain_parts, 0, $domain_parts_count-3);
define('SUBDOMAIN', implode('.', $sub_parts));
unset($sub_parts);
}
else
{
define('SUBDOMAIN', '');
}
define('DOMAIN', implode('.', $domain_parts));
var_dump($domain_parts, SUBDOMAIN, DOMAIN);exit;
只是认为 mod_rewrite 可以将子域作为获取参数附加吗?