用动态主机名替换htaccess规则中的域名

时间:2018-12-06 16:20:24

标签: apache .htaccess mod-rewrite

我在htaccess中有此规则:

1 ## Protect from spam bots ##
2 RewriteEngine On
3 RewriteCond %{REQUEST_METHOD} POST
4 RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
5 RewriteCond %{HTTP_REFERER} !.DOMAIN.COM.* [OR]
6 RewriteCond %{HTTP_USER_AGENT} ^$
7 RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

我想用动态主机名替换第5行的 DOMAIN.COM 。 我想对其他域使用相同的规则,而不必修改htaccess

非常感谢!

1 个答案:

答案 0 :(得分:0)

RewriteCond %{HTTP_REFERER} !.DOMAIN.COM.* [OR]

之所以复杂,是因为在{em> CondPattern (%{HTTP_HOST}指令的第二个参数)中未扩展形式为RewriteCond的服务器变量,因为它是 PCRE (正则表达式)。

代替上面的行,您可以执行以下操作:

RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^(.*?)@@https?://\1/ [OR]

这将检查请求的Host标头是否与HTTP Referer标头的 hostname 部分匹配。

\1反向引用(在引用者中)与主机匹配。 @@字符串是任何其他情况下都不会出现的唯一字符串。

请注意,合法用户有可能根本不发送HTTP Referer标头,在这种情况下,您当前的规则集也会失败

RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

请注意,RewriteRule中的 substitution 字符串格式错误。它是一个“普通”字符串,而不是正则表达式。因此,锚点^$将被视为文字字符,应将其删除:

RewriteRule .* http://%{REMOTE_ADDR}/ [R=301,L]