2015-02-04 34 views
1

有人可以解释下面的mod_rewrite脚本是如何工作的? 目标是捕获对probe.com的访问权限,该权限没有任何关注,并将其重定向到probewebsites.com。如果访问probe.com/anything(如probe.com/register.php),则访问将保留在probe.com中,在此情况下,将访问probe.com/register.php。试图了解mod_rewrite脚本

该脚本的作品,我只是不知道如何。

我看到第2行寻找对probe.com的访问。 然后,第3行以某种方式验证probe.com后没有任何内容。 第4行看起来像是收集反向引用,但从未使用过。 感谢您的帮助。

1. RewriteEngine on 
2. RewriteCond %{HTTP_HOST} probe\.com [NC] 
3. RewriteCond %{REQUEST_URI} ^/$ 
4. Rewriterule ^(.*)$ http://probewebsites.com/ [L,R=301] 

回答

2

您对规则的一般理解是正确的。让我详细说明一下。

RewriteEngine on 

打开这个目录的mod-rewrite规则处理。

RewriteCond %{HTTP_HOST} probe.com [NC] 

看起来像是在寻找probe.com,但事实并非如此。由于它是一个正则表达式,因此.可以匹配任何字符。所以,probeXcom也会通过;并且由于没有指定正则表达式边界(^$),所以它变成了子字符串匹配。这意味着csi.probe.comprobe.com.uk也将匹配。正确的图案匹配仅probe.comwww.probe.com将是

RewriteCond %{HTTP_HOST} ^(www\.)?probe\.com$ [NC] 

^$匹配在其上用相同的名称指的是HTTP报头中的%{HTTP_HOST}的开始和结束边界。 \.转义正则表达式的匹配任何字符.,并立即开始匹配字面点.字符。 (www\.)?中的问号使得捕获的www.可选。最后,[NC]代表,无例,并使测试不区分大小写。

RewriteCond %{REQUEST_URI} ^/$ 

这种状况实际上没有必要的,因为你可以在RewriteRule本身相同的比赛。因此,新的规则应该像

RewriteRule ^$ http://probewebsites.com/ [R=301,L] 

注意,这不是^/$,它不是一个错字。 RewriteRule模式与目录路径匹配,但不包括与%{REQUEST_URI}中相同的前导/

[L]将规则标记为上一个因为我们无论如何都会重定向[R=301]。状态码301向浏览器指示此重定向是永久的,因此浏览器将缓存它。如果你只指定[R],服务器会做一个302暂时移动重定向。

所以,你的最后。htacces应该像

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^(www\.)?probe\.com$ [NC] 
RewriteRule ^$ http://probewebsites.com/ [R=301,L] 
+0

快速的问题,在这条线'的RewriteCond%{HTTP_HOST} ^(WWW \。)?探头\ .COM $ [NC]'你不使用EXP'(WWW \。)'作为反向引用,'()'的目的就是为了将'www \ .'分组,以便'?'适用于'www \ .'分段?另外,是否有一种方法可以在不使用'()'的情况下对'www \ .'进行分组,即,如果您明确不希望该分段被选为背景参考? –

+0

好问题。是的,它的目的是对字符序列进行分组,以便后面的'?'使它成为可选项,但是作为副作用,它也可以作为后向参考。如果您不想将其作为反向引用选取,请以“(?:www \。)?'开始组。开头的'?:'字符序列现在使它成为一个未被引用的组。 –

+0

感谢您的解释。但是,如果出现的请求是probe.com/register.php,那么这将如何失败,以至于它不会重定向到probewebsites.com/register.php? – Steve