通过htaccess从URL中抓取域名作为变量

时间:2014-05-01 09:09:53

标签: php regex .htaccess mod-rewrite

想象一下,在我的网站中,我想展示一些关于域名的分析,我需要的工作网址示例:

http://whois.domaintools.com/google.com

正如您在上面的网址中看到的那样,它将google.com作为变量处理并将其传递给另一个页面以处理给定变量,这正是我想要的。

因此,为了检测那种变量,这是我的正则表达式:

/^[a-zA-Z\d]+(?:-?[a-zA-Z\d])+\.[a-zA-Z]+$/

上面的RegEx非常简单,可以接受以下所有内容:google.com,所以在我的.htaccess文件中我有:

RewriteRule (^[a-zA-Z\d]+(?:-?[a-zA-Z\d])+\.[a-zA-Z]+$) modules/pages/page.php?domain=$1

上述规则可以执行我想要的操作,但它也会将我的homepage重定向到page.php,而网址中没有任何内容,例如:http://mysitename.com现在转发到{{1 }}

我该如何解决这个问题?

提前致谢

1 个答案:

答案 0 :(得分:2)

由于正则表达式,它还将基本域重定向到page.php。你在所有地方使用+,加号的意思是“匹配前面的模式元素一次或多次。”。 (http://en.wikipedia.org/wiki/Regular_expression)如果您请求主页,它会重定向,因为所有元素都出现零次,就像您在正则表达式中定义的那样。

而不是+,您应该定义最小和最大字符数(因此不会评估零次出现)。 BTW,谷歌快速搜索“正则表达式域名”将输出大量结果,并进行测试。例如,使用以下内容:

RewriteEngine on
RewriteRule (^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$) modules/pages/page.php?domain=$1

参考: Domain name validation with RegEx

更新1:

如果您想使用自己的正则表达式,请将最后一个“+”与{2,}交换。顶级域名通常至少包含2个字符。

RewriteEngine on
RewriteCond %{REQUEST_URI} !(\.html|\.php|\.pdf|\.gif|\.png|\.jpg|\|\.jpeg)$
RewriteRule (^[a-zA-Z\d]+(?:-?[a-zA-Z\d])+\.[a-zA-Z]{2,}$) modules/pages/page.php?domain=$1