试图理解mod_rewrite脚本

时间:2015-02-04 18:22:33

标签: apache mod-rewrite

有人可以解释下面的mod_rewrite脚本是如何工作的吗? 目标是捕获对其没有任何内容的probe.com的访问权限并将其重定向到probewebsites.com。如果访问probe.com/anything,例如probe.com/register.php,则访问权限保留在probe.com,访问,在本例中为probe.com/register.php。

脚本有效,我只是不确定如何。

我看到第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]

1 个答案:

答案 0 :(得分:2)

您对规则的一般理解是正确的。让我对此进行扩展。

RewriteEngine on

打开此目录的mod重写规则处理。

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_HOST}的起始和结束边界,它引用同名的HTTP标头。 \.转义正则表达式的任意角色.并立即开始匹配字面点.字符。 (www\.)?中的问号使捕获的www.成为可选项。最后,[NC]代表无案例并使测试不区分大小写。

RewriteCond %{REQUEST_URI} ^/$

实际上不需要此条件,因为您可以在RewriteRule本身中进行相同的匹配。因此,新规则应该看起来像

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

注意,它不是^/$而且不是拼写错误。 RewriteRule模式与目录路径匹配,但不包括/中的前导%{REQUEST_URI}

[L]将规则标记为 last ,因为我们正在重定向,但由[R=301]指定。状态代码301向浏览器指示此重定向是永久性的,因此浏览器将对其进行缓存。如果仅指定[R],则服务器会执行302 暂时移动重定向。

所以,你的最终.htacces看起来应该是

RewriteEngine on

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