许多网站提供 .htaccess 代码来阻止垃圾邮件程序、垃圾邮件推荐等。
有些网站在“.”之前使用“\”。在域名中。例如:
RewriteCond %{HTTP_REFERER} spamdomain\.com [NC,OR]
SetEnvIfNoCase Referer spamdomain\.com spambot=yes
但有些网站使用直接域名。例如:
RewriteCond %{HTTP_REFERER} spamdomain.com [NC,OR]
SetEnvIfNoCase Referer spamdomain.com spambot=yes
现在我很困惑哪种代码语法是正确的?两个代码都可以正常工作吗?我应该使用哪一个?
因为
RewriteCond
andSetEnvIfNoCase
指令的第二个参数都是正则表达式(regex),而不是普通的字符串。正则表达式使用一种特殊的语法来定义搜索模式。在正则表达式语法中,点/句点是一个特殊的(元)字符,表示任何字符(默认情况下换行符除外)。为了匹配文字点(即禁用其特殊含义),您需要反斜杠转义点(即在点之前放置反斜杠)。因此,正则表达式匹配被测试字符串中任意位置
spamdomain\.com
的文字字符串。(在第一个示例中,它匹配服务器变量中的任何位置。)而像(点未转义的)这样的正则表达式将匹配,等。因为点匹配任何字符。spamdomain.com
spamdomain.com
HTTP_REFERER
spamdomain.com
spamdomainAcom
spamdomainBcom
严格来说这是不正确的。正则表达式匹配的比预期的要多。但是,实际上,如果文字点是唯一可能出现在该位置的字符,这可能不是问题。(但在这种情况下,点应该被转义。)
参考: