从$ _SERVER ['SERVER_NAME']中移除子域名

时间:2011-03-16 16:30:35

标签: php regex dns subdomain pattern-matching

我需要创建一个脚本,它会从$ _SERVER ['SERVER_NAME']中删除子域,以便在setcookie函数的domain选项上使用它,以允许在所有可能的子域上访问cookie。

例如,假设我有

function strip_out_subdomain($domain)
{
    //do something to remove subdomain
    return $only_my_domain;
}
$domain = strip_out_subdomain($_SERVER['SERVER_NAME']);
setcookie('mycookie', '123', time()+3600, '/', $domain);

这里的主要问题是我不知道我的域的模式。它可能是这样的:

  • www.mydomain.com
  • subdomain.mydomain.com
  • subdo.mydo.co
  • subdo.subdo.mydomain.com
  • subdo.subdo.mydo.co.uk

谢谢

斯蒂芬妮

4 个答案:

答案 0 :(得分:4)

这是从完整域名中删除子域部分的正则表达式。

  

*?

运算符使通配符匹配不合适,以便它匹配第一个点。

function strip_out_subdomain($domain)
{
    $only_my_domain = preg_replace("/^(.*?)\.(.*)$/","$2",$domain);
    return $only_my_domain;
}

答案 1 :(得分:3)

是否可以在服务器配置中定义变量(httpd.conf,.htaccess)? 它需要一些额外的初始管理,但至少可以在一个中心位置完成。

我能够在Apache中设置一个变量

SetEnv MY_DOMAIN mydomain.com

可以在PHP中使用:

$_SERVER['MY_DOMAIN']

答案 2 :(得分:2)

您可以使用cURL查询 Alexa服务,并使用解压缩主机名而不使用子域名:

function hostname($domain) {

$querystring = 'http://xml.alexa.com/data?cli=10&dat=nsa&ver=quirk-searchstatus&uid=19700101000000&userip=127.0.0.1&url='.urlencode($domain);
$ch = curl_init();
$user_agent = $_SERVER['HTTP_USER_AGENT'];
curl_setopt ($ch, CURLOPT_URL, $querystring);
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_TIMEOUT, 120);
$data= curl_exec($ch);
curl_close($ch);

preg_match('/\<POPULARITY URL="(.*?)" TEXT="(.*?)" SOURCE="(.*?)"\/\>/Ui',$data,$extract);
$hostname = str_replace('/', '', $extract[1]);

return($hostname);
}

答案 3 :(得分:1)

我知道这是多年以后,但为什么不这样:

$dom='a.b.c.d.co.jp';
$sub=preg_replace("/.*?([^\.]+)(\.((co\.\w+)|\w+))$/i",'\1\2',$dom); //strip subdomains

这会打印d.co.jp

.*?([^\.]+)(\.((co\.\w+)|\w+))$的意思是:

.*? 懒惰(因此它不会占用主域名)匹配所有字符,直到下面的内容

([^\.]+) 匹配不包含点的字符组(即主域或次顶域)( + 确保该类中至少有一个字符)并稍后将其返回 \ 1

(\.((co\.\w+)|\w+)) 将TLD与其前一个点匹配,无论是 .co。某事 还是。< em> something 并通过 \ 2 将其归还;加号在这里做同样的事情

$ 将所有内容锚定到字符串的末尾,这样我们就可以从TLD一直到左边的子域部分,无论它们有多少

P.S。我不知道是否还有其他两部分TLD,但也可以添加。快速浏览https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains告诉我没有,但如果有任何我猜他们没有那么多。