Назад | Перейти на главную страницу

заменить доменное имя в правиле htaccess на динамическое имя хоста

У меня есть это правило .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]