试图理解 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.com
或 probe.com.uk
也会匹配。仅匹配 probe.com
或 www.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]
谁能解释一下下面的 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.com
或 probe.com.uk
也会匹配。仅匹配 probe.com
或 www.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]