有人可以解释下面的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]
答案 0 :(得分:2)
您对规则的一般理解是正确的。让我对此进行扩展。
RewriteEngine on
打开此目录的mod重写规则处理。
RewriteCond %{HTTP_HOST} probe.com [NC]
看起来它正在寻找probe.com
,但事实并非如此。由于它是正则表达式模式,.
将匹配任何字符。所以,probeXcom
也会通过;由于未指定正则表达式边界(^
,$
),因此它成为子字符串匹配。这意味着csi.probe.com
或probe.com.uk
也会匹配。仅匹配probe.com
或www.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]