代码之家  ›  专栏  ›  技术社区  ›  datasn.io

用PHP动态识别子域的最佳方法是什么?

  •  1
  • datasn.io  · 技术社区  · 15 年前

    我已经配置了*.mydomain.com的通配符dns,它都正常工作。我的问题是,我应该依赖于哪一个来识别客户机子域请求?

    1. $_服务器[“http_主机”]
    2. $服务器[“服务器名称”]
    3. $服务器[“script\u uri”]

    它们似乎都包含了我想要的子域部分,但是在阅读了Chris的这篇文章之后: http://shiflett.org/blog/2006/mar/server-name-versus-http-host 我在海上迷路了,似乎没有安全的方法来做这件事?

    有没有想过安全地完成这项任务?你喜欢哪种方法?

    更新:抱歉,我的意思是: http://shiflett.org/blog/2006/mar/server-name-versus-http-host

    5 回复  |  直到 15 年前
        1
  •  0
  •   zaf    15 年前

    您可以使用任何一个,但大多数使用的是http_主机。

    您不必担心这里的“安全性”,因为您允许子域使用通配符。您将无法阻止用户进入“威胁”子域并向您的服务器发送请求。

    如果您想禁止某些子域,那么您有几个选项,但这是一个不同的问题。

        2
  •  3
  •   Rasmus    15 年前

    http_主机直接来自主机头。阿帕奇不会以任何方式清理它。即使对于非通配符设置,配置中的第一个虚拟主机也会收到一个主机头请求,该主机头与配置的任何vhost都不匹配,因此必须小心。像对待其他用户数据一样对待它。使用前适当过滤。

        3
  •  1
  •   sjobe    15 年前

    我建议您获取当前页面的URL,然后使用正则表达式进行检查。请务必忽略链接www、www2等内容。

        4
  •  0
  •   Mark Tomlin    15 年前
    $subdomain = explode('.', $_SERVER['HTTP_HOST'], -2);
    

    始终返回数组,如果没有子域,则可以为空。你也应该注意到这可能会回来 www 作为数组值,它将链接到根域。

        5
  •  0
  •   Your Common Sense    15 年前

    这么小的问题说得太多了。
    每个人都说这很危险,但没人费心写一个解决方案,就像

    $mydomain='example.com';
    $subdomain="";
    $matches=array();
    
    $pat='!([a-z0-9_]+)\.'.preg_quote($mydomain).'$!i';
    if (preg_match($pat,$_SERVER['HTTP_HOST'],$matches)) $subdomain=$matches[1];