我已经配置了* .mydomain.com的通配符DNS,它们都正常工作。我的问题是,我应该依赖哪些客户端子域请求?
它们似乎都包含我想要的子域部分但是在阅读了Chris的这篇文章之后:http://shiflett.org/blog/2006/mar/server-name-versus-http-host,我在海上迷路了,似乎没有安全的方法可以做到这一点?
有关安全完成此任务的任何想法吗?您更喜欢哪种方式?
更新:对不起,我的意思是这篇文章:http://shiflett.org/blog/2006/mar/server-name-versus-http-host
答案 0 :(得分:3)
HTTP_HOST直接来自HOST标头。 Apache不会以任何方式清理它。即使对于非通配符设置,配置中的第一个虚拟主机也会收到与您配置的任何vhost都不匹配的HOST标头的请求,因此您必须小心。像任何其他用户数据一样对待它。在使用之前适当过滤它。
答案 1 :(得分:1)
我建议您获取当前页面网址,然后使用正则表达式进行检查。一定要忽略链接www,www2等的事情。
答案 2 :(得分:0)
$subdomain = explode('.', $_SERVER['HTTP_HOST'], -2);
始终返回一个数组,如果没有子域,则可以为空。您还应该注意,这可能会将www
作为数组值返回,并且无论如何都会链接到您的根域。
答案 3 :(得分:0)
你可以使用任何但最常用的HTTP_HOST。
您不必担心'安全',因为您允许子域使用通配符。您将无法阻止用户输入“威胁”子域并向您的服务器发送请求。
如果您想禁用某些子域,那么您有几个选项,但这是一个不同的问题。
答案 4 :(得分:0)
太多关于这样一个小问题的讨论 每个人都说它很危险,但没有人费心去编写解决方案,就像
一样简单$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];