许多网站提供 .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
现在我很困惑哪种代码语法是正确的? 两种代码都能正常工作吗? 我应该使用哪一个?
答案1
RewriteCond
因为和指令的第二个参数SetEnvIfNoCase
都是常用表达(正则表达式),而不是普通字符串。正则表达式使用特殊语法来定义搜索模式在正则表达式语法中,点/句点是一个特殊(元)字符,代表任意字符(默认情况下,换行符除外)。为了匹配文字点(即禁用其特殊含义),您需要使用反斜杠转义点(即在点前放置反斜杠)。
因此,正则表达式likespamdomain\.com
匹配文字字符串spamdomain.com
任何地方在被测试的字符串中。(在第一个例子中,它匹配spamdomain.com
任何地方在服务器变量中。)而像(其中点未被转义)HTTP_REFERER
这样的正则表达式将匹配、等。因为点可以匹配任何字符。spamdomain.com
spamdomainAcom
spamdomainBcom
RewriteCond %{HTTP_REFERER} spamdomain.com [NC,OR]
严格来说,这是不正确的。正则表达式匹配的字符超出了预期。但是,实际上,如果文字点是唯一可能出现在该位置的字符,那么这可能不是问题。(但在这种情况下,应该对点进行转义。)
参考: