Остановите хотлинкинг с использованием htaccess и неспецифического кода домена

Мне нужно написать команду anti-hotlink для моего файла.htaccess, но она не может быть специфичной для какого-либо конкретного доменного имени. Вот что я нашел на других сайтах до сих пор, но я не уверен точно, почему это не работает, кто-нибудь может определить проблему?

# Stop hotlinking.
#------------------------------
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} ^https?://([^/]+)/ [NC]
# Note the # is just used as a boundary. It could be any character that isn't used in domain-names.
RewriteCond %1#%{HTTP_HOST} !^(.+)#\1$
RewriteRule \.(bmp|gif|jpe?g|png|swf)$ - [F,L,NC]

1 ответ

Решение

Попробуй это.

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} ^https?://(www\.)?([^/]+)/.*$ [NC]
RewriteCond %2#%{HTTP_HOST} !^(.+)#(www\.)?\1$ [NC]
RewriteRule \.(bmp|gif|jpe?g|png|swf)$ - [F,L,NC]

Будет работать даже тогда, когда только один из ссылающихся или целевых URL имеет ведущую www.

РЕДАКТИРОВАТЬ: (как эта% вещь работает?)

%n ссылается на сопоставленное содержимое n(й) скобки из условия последнего сопоставленного перезаписи.

Итак, в этом случае

  • %1 = либо www. ИЛИ ЖЕ "" пусто (потому что это необязательно; используется ()? сделать это)
  • %2 знак равно yourdomain.com (без www всегда)

Итак, теперь условие перезаписи фактически пытается соответствовать

yourdomain.com#stealer.com OR yourdomain.com#www.stealer.com

с ^(.+)#(www\.)?\1$ что значит (.+)# все и вся перед # с последующим www. (но опять же необязательно); с последующим \1 содержимое, соответствующее первой скобке (в этом регулярном выражении, а не в условии перезаписи), т.е. #,

Так, stealer.com не сможет регулярное выражение в то время как yourdomain.com пройдет. Но, так как мы отрицали правило с !; stealer.com проходит условие и, следовательно, применяется правило остановки горячей связи.

Другие вопросы по тегам