Остановите хотлинкинг с использованием 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
проходит условие и, следовательно, применяется правило остановки горячей связи.