Прекратить хотлинкинг с использованием htaccess и кода домена, не относящегося к конкретному домену.

Мне нужно написать команду анти-хотлинка для моего файла .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]

person Vince    schedule 03.07.2013    source источник
comment
Примечание. Приведенный выше код основан на другом сообщении/ответе Stackoverflow, который, похоже, не работает. ссылка   -  person Vince    schedule 03.07.2013
comment
Это работает для меня, когда я помещаю его в пустой htaccess, любое изображение с горячей ссылкой возвращается 403, каждое изображение, которое я просматриваю на странице того же сайта, возвращается 200.   -  person Jon Lin    schedule 03.07.2013
comment
@jon Привет, Джон, я упомянул ниже, что по какой-то причине он снова начал работать для меня. Я думаю, что меня обманывают браузеры, которые просто не очищают свой кеш, когда страницы обновляются с помощью кнопки SHIFT + Reload. Тем не менее, мне нужна была дополнительная помощь, чтобы понять, как именно работает этот код, и Рави проделал большую работу.   -  person Vince    schedule 04.07.2013


Ответы (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(th) из последнего совпавшего условия перезаписи.

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

  • %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 соответствует условию и, следовательно, применяется правило блокировки горячих ссылок.

person Ravi K Thapliyal    schedule 03.07.2013
comment
%2 нельзя использовать в параметре шаблона RewriteCond - person Jon Lin; 03.07.2013
comment
@JonLin А, это правильно. Внезапно состояние ОП теперь имеет для меня большой смысл. Спасибо. - person Ravi K Thapliyal; 03.07.2013
comment
@Ravi Теперь я действительно запутался, внезапно мой первый пример снова заработал, и, судя по его внешнему виду, после того, как вы внесли последнее редактирование, ваше предложение кода выглядит почти точно так же, как мой код вопроса. Можете ли вы указать конкретные усовершенствования, которые вы сделали, и почему вы считаете, что они необходимы? Я больше всего смущен тем, как на самом деле работает строка 3. Как на самом деле работает %2#%{HTTP_HOST}? - person Vince; 04.07.2013
comment
И зачем выделять (www\.)?, разве это не что-то автоматически включенное в строки HTTP_HOST для веб-сайтов, которые его используют? - person Vince; 04.07.2013
comment
Проклятый 5-минутный тайм-аут... Серверы, изначально настроенные как abc.com с псевдонимом www.abc.com, выводят только abc.com для HTTP_HOST независимо от того, какой из них вызывается? - person Vince; 04.07.2013
comment
@Vince Пожалуйста, проверьте мое обновленное правило, а также объяснение. - person Ravi K Thapliyal; 04.07.2013
comment
@Vince %{HTTP_HOST} будет начинаться с www. (или нет) в зависимости от того, включает ли ссылка на сайтsteler.com или URL-адрес, который был введен в браузере для доступа к вашему сайту, или нет. - person Ravi K Thapliyal; 04.07.2013
comment
@ravi Маленькая опечатка, я думаю, Рави. yourdomain.com#stealer.com OR yourdomain.com#www.stealer.com должно быть yourdomain.com#stealer.com OR www.yourdomain.com#stealer.com. Могу ошибаться, для меня это сложная тема. - person Vince; 04.07.2013
comment
@Vince (www\.)? и %2 в условии перезаписи гарантируют, что совпадение всегда будет начинаться с yourdomain.com#. При переходе с вашего собственного сайта с www. будет применено регулярное выражение к yourdomain.com#www.yourdomain.com, которое все равно пройдет, потому что (www\.)? является необязательным в регулярном выражении. Причина такой запутанности в том, что мы не можем сказать, идет ли %{HTTP_HOST} с www. или без :) - person Ravi K Thapliyal; 04.07.2013