在 .htaccess 代码中的域名中的 DOT 之前使用“\”

TSA*_*TSA 2 rewrite .htaccess apache2

许多网站提供 .htaccess 代码来阻止垃圾邮件机器人、垃圾邮件推荐等。

一些网站在“.”之前使用“\”。在域名中。例如:

RewriteCond %{HTTP_REFERER} spamdomain\.com [NC,OR]

SetEnvIfNoCase Referer spamdomain\.com spambot=yes
Run Code Online (Sandbox Code Playgroud)

但有些网站使用直接域名。例如:

RewriteCond %{HTTP_REFERER} spamdomain.com [NC,OR]

SetEnvIfNoCase Referer spamdomain.com spambot=yes
Run Code Online (Sandbox Code Playgroud)

现在我很困惑哪种代码语法是正确的?两个代码都能正常工作吗?我应该使用哪一种?

MrW*_*ite 9

因为RewriteCondSetEnvIfNoCase指令的第二个参数是正则表达式(regex),而不是普通字符串。正则表达式使用一种特殊的语法来定义搜索模式。在正则表达式语法中,点/句点是一个特殊的(元)字符,它代表任何字符(默认情况下换行符除外)。为了匹配文字点(即禁用其特殊含义),您需要反斜杠转义点(即在点之前放置反斜杠)。

因此,像这样的正则表达式spamdomain\.com匹配被测试字符串中spamdomain.com 任何地方的文字字符串。(在第一个例子,它匹配spamdomain.com 的任何地方HTTP_REFERER服务器变量。)鉴于像一个正则表达式spamdomain.com(其中点尚未逸出)将匹配spamdomainAcomspamdomainBcom等等。由于点的任何字符匹配。

RewriteCond %{HTTP_REFERER} spamdomain.com [NC,OR]
Run Code Online (Sandbox Code Playgroud)

严格来说这是不正确的。正则表达式的匹配程度超出预期。但是,实际上,如果文字点是唯一可以出现在该位置的字符,则这可能不是问题。(但在这种情况下,点应该被转义。)

参考: