Php 以编程方式获取cookie的域

Php 以编程方式获取cookie的域,php,regex,cookies,Php,Regex,Cookies,我想为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

我想为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
  • 等等

您将使用$\u SERVER['SERVER\u NAME']变量。它将返回执行脚本的主机

如果需要特定零件,可以使用explode

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

我不建议这样做,例如,一个.co.uk域将被错误地捕获。您知道了。

您将使用$\u SERVER['SERVER\u NAME']变量。它将返回执行脚本的主机

如果需要特定零件,可以使用explode

$temp = explode(".", $_SERVER['SERVER_NAME']);
$host = implode(".", ($temp[count($temp) - 1], $temp[count($temp) - 2]));
我不建议这样做,例如,一个.co.uk域将被错误地捕获。你明白了。

我找到了一个解决方案,并提出了以下解决方案,除了域名中3个或更少字符和2个字符的TLD(如www.ex.co)外,该解决方案大部分时间都有效:

我找到了一个解决方案,并提出了以下解决方案,该解决方案在大多数情况下都有效,但域名中只有3个或更少字符,TLD为2个字符(如www.ex.co):


如果没有包含值的数组,这似乎是不可能的。 可以避免迭代到数组中,以检查+-所有域,但不是所有域。有了这样的东西(也许可以改进),您将获得正确的cookie域名。它仅对数组迭代一次,并检查一个值:

已编辑:代码已得到改进

改进版:

$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;

如果没有包含值的数组,这似乎是不可能的。 可以避免迭代到数组中,以检查+-所有域,但不是所有域。有了这样的东西(也许可以改进),您将获得正确的cookie域名。它仅对数组迭代一次,并检查一个值:

已编辑:代码已得到改进

改进版:

$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;

它还返回脚本在其中执行的子域,我不需要该部分。好的,应该这样做,但我认为这是一个坏主意。我不是100%你在那里试图做的,它会在第二行生成一个错误
意外,
。此外,我只是在设置脚本中将其作为默认值使用,因此用户可以选择更改以指定他们真正想要使用的域(如果不是全部)。分解基于分隔符点将字符串拆分为多个部分。然后你把最后两块粘在一起,我就是这么想的。括号前缺少
array
,这对TLD不起作用,如
.co.uk
,它还返回执行脚本的子域,我不想要那一块。好的,应该这样做,但我认为这是个坏主意。我不是100%你想做的,它会产生一个意想不到的
错误,
在第二行。此外,我只是在设置脚本中将其作为默认值使用,因此用户可以选择更改以指定他们真正想要使用的域(如果不是全部)。分解基于分隔符点将字符串拆分为多个部分。然后你把最后两块粘在一起,我就是这么想的。括号前缺少
数组
,这对像
.co.uk这样的TLD不起作用