2011-12-27 35 views
1

我想爲cookie和會話cookie設置域名,使其適用於所有子域。我知道我可以利用這樣做以下:以編程方式獲取cookie的域名

session_set_cookie_params(0, '/', '.example.com'); 
set_cookie('name', value, expires, '/', '.example.com'); 

我如何從PHP服務器變量.example.com?問題是,我需要讓它適用於所有類型的域模式,例如

  • www.example.com
  • example.com
  • example.co.uk
  • subdomain.example.co.uk
  • sub1.sub2.example.co.uk
  • 等等。

回答

1

我發現了一個answer並用以下解決方案,並用兩個字符TLD工作的大部分時間,有3點或更少的字符異常的域名(如www.ex.co)想出了:

$domain = false; 
$host = parse_url('http://'.$_SERVER['SERVER_NAME'], PHP_URL_HOST); 
if(preg_match('/([a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $host, $m)) { 
    $domain = $m[1]; 
} 
0

您將使用$ _SERVER ['SERVER_NAME']變量。它將返回正在執行腳本的主機。

如果你想要一個特定的部分,你可以使用爆炸。

$temp = explode(".", $_SERVER['SERVER_NAME']); 
$host = implode(".", ($temp[count($temp) - 1], $temp[count($temp) - 2])); 

我不推薦它,例如.co.uk域名將被錯誤地捕獲。你明白了。

+0

它還返回腳本中執行的子域,我不希望那件。 – steveo225 2011-12-27 04:01:14

+0

讓我編輯它! – 2011-12-27 04:03:05

+0

好吧,應該這樣做,但我認爲這是一個壞主意。 – 2011-12-27 04:08:13

0

這似乎是不可能的,沒有包含值的數組。 可能會避免迭代到數組中以檢查+ - 所有域,但不是所有域。有了這樣的東西(也許可以改進),你會得到正確的cookie域名。它迭代只有一次數組,並檢查一個值: https://www.axew3.com/w3/2017/05/extract-domain-name-for-cookie-php-function/

編輯:代碼已被改進。

改進版本:

$w3domains = array(".aero",".biz",".cat",".com",".coop",".edu",".gov",".info",".int",".jobs",".mil",".mobi",".museum", 
    ".name",".net",".org",".travel",".ac",".ad",".ae",".af",".ag",".ai",".al",".am",".an",".ao",".aq",".ar",".as",".at",".au",".aw", 
    ".az",".ba",".bb",".bd",".be",".bf",".bg",".bh",".bi",".bj",".bm",".bn",".bo",".br",".bs",".bt",".bv",".bw",".by",".bz",".ca", 
    ".cc",".cd",".cf",".cg",".ch",".ci",".ck",".cl",".cm",".cn",".co",".cr",".cs",".cu",".cv",".cx",".cy",".cz",".de",".dj",".dk",".dm", 
    ".do",".dz",".ec",".ee",".eg",".eh",".er",".es",".et",".eu",".fi",".fj",".fk",".fm",".fo",".fr",".ga",".gb",".gd",".ge",".gf",".gg",".gh", 
    ".gi",".gl",".gm",".gn",".gp",".gq",".gr",".gs",".gt",".gu",".gw",".gy",".hk",".hm",".hn",".hr",".ht",".hu",".id",".ie",".il",".im", 
    ".in",".io",".iq",".ir",".is",".it",".je",".jm",".jo",".jp",".ke",".kg",".kh",".ki",".km",".kn",".kp",".kr",".kw",".ky",".kz",".la",".lb", 
    ".lc",".li",".lk",".lr",".ls",".lt",".lu",".lv",".ly",".ma",".mc",".md",".mg",".mh",".mk",".ml",".mm",".mn",".mo",".mp",".mq", 
    ".mr",".ms",".mt",".mu",".mv",".mw",".mx",".my",".mz",".na",".nc",".ne",".nf",".ng",".ni",".nl",".no",".np",".nr",".nu", 
    ".nz",".om",".pa",".pe",".pf",".pg",".ph",".pk",".pl",".pm",".pn",".pr",".ps",".pt",".pw",".py",".qa",".re",".ro",".ru",".rw", 
    ".sa",".sb",".sc",".sd",".se",".sg",".sh",".si",".sj",".sk",".sl",".sm",".sn",".so",".sr",".st",".su",".sv",".sy",".sz",".tc",".td",".tf", 
    ".tg",".th",".tj",".tk",".tm",".tn",".to",".tp",".tr",".tt",".tv",".tw",".tz",".ua",".ug",".uk",".um",".us",".uy",".uz", ".va",".vc", 
    ".ve",".vg",".vi",".vn",".vu",".wf",".ws",".ye",".yt",".yu",".za",".zm",".zr",".zw"); 

$w3cookie_domain = 'axew3.com'; 
//$w3cookie_domain = 'sub.mydomain.eu'; 
//$w3cookie_domain = 'tes.originalgangster.co.uk'; 
//$w3cookie_domain = 'sub3.sub2.sub1.example.co.uk'; 
//$w3cookie_domain = 'subdomain.example.co.uk'; 
//$w3cookie_domain = 'sub1.sub2.example.it'; 
//$w3cookie_domain = 'example.co.uk'; 

$count_dot = substr_count($w3cookie_domain, "."); 

    if($count_dot >= 3){ 
     preg_match('/.*(\.)([-a-z0-9]+)(\.[-a-z0-9]+)(\.[a-z]+)/', $w3cookie_domain, $w3m0, PREG_OFFSET_CAPTURE); 
     $w3cookie_domain = $w3m0[2][0].$w3m0[3][0].$w3m0[4][0]; 
    } 

    $ckcd = explode('.',$w3cookie_domain); 

    if(!in_array('.'.$ckcd[1], $w3domains)){ 
    $w3cookie_domain = preg_replace('/^[^\.]*\.([^\.]*)\.(.*)$/', '\1.\2', $w3cookie_domain); 
    } 

    $w3cookie_domain = '.' . $w3cookie_domain; 

    echo $w3cookie_domain;