У меня есть это правило .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} !.EXAMPLE.COM.* [OR]
6 RewriteCond %{HTTP_USER_AGENT} ^$
7 RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
Я хочу заменить ПРИМЕР.COM в строке 5 с динамическим именем хоста. Я хотел бы использовать то же правило с другим доменом без изменения .htaccess
.
RewriteCond %{HTTP_REFERER} !.DOMAIN.COM.* [OR]
Сложность возникает из-за того, что серверные переменные вида %{HTTP_HOST}
не раскрываются в CondPattern (2-й аргумент RewriteCond
директива), поскольку это PCRE (регулярное выражение).
Вместо приведенной выше строки вы можете сделать что-то вроде этого:
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^(.*?)@@https?://\1/ [OR]
Это проверяет, что запрошенный Host
заголовок соответствует имя хоста часть HTTP Referer
заголовок.
В \1
обратная ссылка (в Referer) совпадает с Host. В @@
строка - это просто любая уникальная строка, которая иначе не может возникнуть.
Обратите внимание, что законные пользователи могут не отправлять HTTP Referer
заголовок вообще, и в этом случае ваш текущий набор правил также будет потерпеть поражение.
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
Обратите внимание, что замена строка в вашем RewriteRule
неправильно сформирован. Это «обычная» строка, а не регулярное выражение. Следовательно, якоря ^
и $
будут отображаться как буквальные символы и должны быть удалены:
RewriteRule .* http://%{REMOTE_ADDR}/ [R=301,L]