我需要创建一个脚本,它会从$ _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);
这里的主要问题是我不知道我的域的模式。它可能是这样的:
谢谢
斯蒂芬妮
答案 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告诉我没有,但如果有任何我猜他们没有那么多。