试图理解 mod_rewrite 脚本

Trying to understand a mod_rewrite script

谁能解释一下下面的 mod_rewrite 脚本是如何工作的? 目标是捕获对 probe.com 的访问,但后面没有任何内容,并将其重定向到 probewebsites.com。如果访问的是probe.com/anything,比如probe.com/register.php,则访问停留在probe.com,访问的是probe.[=19] =].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]

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

RewriteEngine on

为此目录打开 mod-rewrite 规则处理。

RewriteCond %{HTTP_HOST} probe.com [NC]

看起来它正在寻找 probe.com 但它不是。由于它是一个正则表达式模式,. 将匹配任何字符。所以,probeXcom 也会通过;由于没有指定正则表达式边界(^$),因此它变成了 sub-string 匹配。这意味着 csi.probe.comprobe.com.uk 也会匹配。仅匹配 probe.comwww.probe.com 的正确模式是

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

^$%{HTTP_HOST} 的开始和结束边界上匹配,后者引用同名的 HTTP header。 \. 转义正则表达式的 match-on-any-character . 并开始匹配文字点 . 字符。 (www\.)? 中的问号使捕获的 www. 可选。最后,[NC] 代表 no case 并进行测试 case-insensitive.

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]