анти-связывание изображений (настраиваемое регулярное выражение)

Я хотел бы настроить регулярное выражение, которое запрещало бы горячее связывание изображений, которые НЕ заканчиваются следующим шаблоном: -200.jpg

«200» на самом деле может быть «150» или «250» или любым числом от 100 до 999 (то есть 3 символа). .jpg может быть .jpeg или .png, допускается горячее связывание .gif.

Я начал с чего-то вроде этого:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?mywebsite\.com/ [NC]
RewriteRule [^0-9]{3}\.(jpe?g|png)$ /img/hotlink.gif [NC,R,L]

Например: Это должно быть разрешено: h*ttp://mywebsite.tld/dir/dir/hello_sdfk456er_142.jpg-200.jpg тогда как это должно быть запрещено: h*ttp://mywebsite.tld/dir/dir/hello_sdfk456er_142.jpg

Но это не работает.

Также обратите внимание на следующее:

Я использую url_rewriting, чтобы html-страница, отображающая изображение, была похожа на h*ttp://mywebsite.tld/username/1337.jpg , где 1337 означает идентификатор изображения в базе данных. Причина, по которой я подчеркиваю эту тонкость, заключается в том, что такое правило, как:

RewriteRule ![0-9]{3}\.(jpe?g|png)$ /img/hotlink.gif [NC,R,L]

не будет работать.

РЕДАКТИРОВАТЬ:

Я просто решил это, добавив некоторые исключения:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?mywebsite\.com/ [NC]
RewriteCond %{REQUEST_URI}  !-[0-9]{3}\.(jpe?g|gif|png)$ [NC]
RewriteCond %{REQUEST_URI}  !/[0-9]+\.(jpe?g|gif|png)$ [NC]
RewriteRule \.(jpe?g|png)$  /img/hotlink.gif [NC,R,L]

Если вы знаете "более сексуальный" способ, пожалуйста, дайте мне знать. В любом случае, спасибо парню, который попробовал (удалил свои сообщения?)


person Community    schedule 06.12.2012    source источник


Ответы (1)


В вашем решении есть два недостатка:

  1. 4-я строка с /[0-9]+ также позволит хотлинковать изображения, которые названы просто 200.jpg (без дефиса).
  2. Условие RewriteRule отсутствует, поэтому .gif изображений нельзя хотлинковать.

Вот обновленная версия:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?mywebsite\.com/ [NC]
RewriteCond %{REQUEST_URI}  !-[0-9]{3}\.(jpe?g|gif|png)$ [NC]
RewriteRule .* http://mywebsite.com/img/hotlink.gif [NC,R,L]

Вы можете прочитать это следующим образом:

  1. Если реферер не пуст
  2. И реферер не мой сайт
  3. И запрашивается изображение, которое не заканчивается разрешенным шаблоном (например, -123.gif).
  4. Затем покажите hotlink.gif
person Geo    schedule 07.12.2012
comment
Четвертая строка — это просто побег для моего url_rewriting, так как у меня есть несколько HTML-страниц, называемых вроде h*ttp://mywebsite.tld/dir/dir/5465.jpg , которые на самом деле являются не изображениями, а HTML-страницами. Я не размещаю изображения типа {NUMBER}.jpg, я переименовываю все загруженные изображения, чтобы с помощью этого трюка нельзя было обойти анти-хотлинк. Мое решение на самом деле работает достаточно хорошо, единственная проблема, которая у меня есть сейчас, это: если я добавлю изображения .gif в правило анти-хотлинка, изображение hotlink.gif не отображается (что-то вроде бесконечного цикла?). Спасибо. - person ; 07.12.2012
comment
Что, если вместо добавления .gif добавить .*, как я предложил? Все еще бесконечный? - person Geo; 07.12.2012
comment
Все равно так не получается. Я добавил исключение, чтобы избежать бесконечного цикла перенаправления, например RewriteCond %{REQUEST_URI} !/img/hotlink.gif$ [NC]. Также я чувствую, что не получаю такого же поведения, учитывая браузер... (Отлично работает с IE и Chrome, но FF иногда необъяснимым образом запускает анти-хотлинк. Я не не понял... Может проблема с кешем.) - person ; 07.12.2012