Настройки файла .htaccess

Автор xtuff, 2-02-2004, 20:15

« предыдущая тема - следующая тема »
Вниз

xtuff

Столкнулся недавно с небольшой проблемкой: необходимо было сделать правило против хотлинка (воровства файлов и картинок). С самим правилом проблем не было, написал следующее правило:

SetEnvIfNoCase Referer "^http://(.*)mydomain.com" local_ref=1
<FilesMatch ".(gif|jpg|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>

Все отлично работает, картинки показывать не дает.
Но в этом то и проблема, что иногда таки бывает необходимо где-то запостить картинку из этой папки.
Вообщем-то, конечно, можно создать специальную папку, вроде /images/pub и туда складывать все картинки, доступ к которым будет с любых серверов. Но это может породить проблему дублирования и пустой растраты места на сервере, особенно если таких файлов будет много и они будут довольно объемными.
Внимание вопрос!
Каким образом можно сделать исключения из правила и можно ли это вообще сделать?

Гость_Sych

Можно сделать такую фишку, как сейчас сделано на народ.ру: при хотлинке на картинку на их сервере показывается страница (естественно, вся забитая баннерами... :)) на которой написано что-то вроде "Вы запросили изображение с адреса: http://pupkin.narod.ru/picture.jpg, нажмите на ссылку чтобы его просмотреть". Я сам в этом не очень разбюираюсь, но мне однажды посоветовали такой код:

Цитировать

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(gif|jpg)$ http://www.mydomain.com/dontstealme.jpg [R,L]


Думаю что в последней строке вполне можно вписать адрес страницы которая будет выдаваться в случае хотлинка, а в ее тексте написать код на SSI:

Цитировать
Запрошенное вами изображение:
<a href=http://<!--#echo var="HTTP_HOST" --><!--#echo var="REQUEST_URI" -->>
<!--#echo var="HTTP_HOST" --><!--#echo var="REQUEST_URI" -->
</a>


Сам не проверял, о результатах сообщи!  :rolleyes:  

igor_ber

Гость_Sych - говорит правильно, он предложил решение проблемы через mod_rewrite - модуль апатчи. Чем это удобно, так тем, что можно это дело всунуть куда хочешь в .htaccess и все папки под этим будут affected. То, что предложил xtuff - тоже работает, но оно к сожелению только на уровне конфига апача, что доступно только админу, а не любому пользователю хостинга.

igor_ber

Упс, счас доку еще раз просмотрел - SeEnvtIfNoCase в .htaccess-е тоже можно прописать ... Но зато это встроеная комманда в апачи - т.е. она обрабатывается на уровне сервера, а RewriteCond и т.п - это все на уровне модуля mod_rewrite, который вроди не мало грузит тачку ...

igor_ber

Цитировать
Каким образом можно сделать исключения из правила и можно ли это вообще сделать?

Есть такая фича

UnsetEnv LD_LIBRARY_PATH


Читай на: http://httpd.apache.org/docs/mod/mod_env.html#unsetenv

Кстати, у тебя Apache 2 или 1?

xtuff

фишка с mod_rewrite хороша, особенно тем, что можно легко организовать перенаправление.
Но, как и сказал уже igor_ber, в некоторых случаях она может создавать большие нагрузки на сервер и тормозить не по-детски.

Ну а пока что проблему решил все-таки при помощи SetEnvIfNoCase

igor_ber

Цитировать
Упс, счас доку еще раз просмотрел - SeEnvtIfNoCase в .htaccess-е тоже можно прописать ... Но зато это встроеная комманда в апачи - т.е. она обрабатывается на уровне сервера, а RewriteCond и т.п - это все на уровне модуля mod_rewrite, который вроди не мало грузит тачку ...

Поигрался я с апачи более детально и вот что нашел:
Env функции входят в модуль mod_env и mod_setenvif(http://httpd.apache.org/docs/mod/mod_setenvif.html#setenvifnocase) который можно откомпилировать в месте с апачи или как отдельный модуль ... В случаи с компиляцией как отдельный модуль, прийдется откомпилировать и mod_so который обеспечивает загрузку подулей с внешнего файла (http://httpd.apache.org/docs/mod/mod_so.html) через LoadModule/LoadFile директиву.


Так что большой разницы между "mod_rewrite sollution" и "Env sollution" я не вижу... Возможно mod_setenvif просто эффективние чем mod_rewrite по CPU usage/Memory ...

xtuff
Цитировать
Ну а пока что проблему решил все-таки при помощи SetEnvIfNoCase

Не подскажешь как?

А вообще, учитывая нагрузку на сервер, имхо, /images/pub решение было бы намного приемлимее, так бы ты портратил немного места на винте (HDD space), но мог бы всегда контролировать остальных + была бы меньше нагрузка на cpu/memory, т.к. бы не проверялись дополнительные правила для исключения, а правило твое на /images/private использывалось бы только при "настоящем хотлинке", т.е. кто-то "стащил" линк и поставил у себя ... Есть одно но - если кто-то "стащит" линк на /images/pub и не будет "белого списка" на эту директорию, то хотлинк всетаки тебе сделают ... Хотя для этого комуто прийдется долго и нудно рытся или прийдется наткнутся на твой линк где-то на /image/pub и позаимствовать его ...

Имхо, при текущем трафике, можно и SetEnvIfNoCase оставить ... Хотя если у тебя не dedicated, а тебя прижимает хостер за cpu/mem уже, то стоит подумать .. Может даже отказатся от /image/pub и перенести его на любой безплатный хостинг ...

Yurist

Слушайте... народ
Ну объясните "лапоухому" на пальцах.
Пример: SetEnvIfNoCase Referer "^http://домен.ком" local_ref=1
<FilesMatch ".(gif|jpg)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>


Всё понятно... но как сделать, чтоб в то-же время картинки можноб было постить скажем и на isranet.info ?
Т.е. просто добавив ещё одну строку: SetEnvIfNoCase Referer "^http://isranet.info" local_ref=1 - не работает...
А как заставить работать с несколькими allowed доменами ?  :huh:

Не моглиб пример запостить тут. ;)

xtuff

Цитировать
Всё понятно... но как сделать, чтоб в то-же время картинки можноб было постить скажем и на isranet.info ?

все просто
просто данную директиву ты не прописываешь в корневом .htaccess, а в каждой папке, файлы которой ты хочешь защитить. таким образом ты создаешь одну папку, например PUB, куда скидываешь все то, что не хочешь защищать

Цитировать

Т.е. просто добавив ещё одну строку: SetEnvIfNoCase Referer "^http://isranet.info" local_ref=1 - не работает...
А как заставить работать с несколькими allowed доменами ?  :huh:

тоже просто. для этого нужно написать эту директиву несколько раз.

пример

SetEnvIfNoCase Referer "^http://(.*)domen.com" local_ref=1
<FilesMatch ".(gif|jpg|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>

SetEnvIfNoCase Referer "^http://(.*)drugoydomen.net" local_ref=1
<FilesMatch ".(gif|jpg|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>

igor_ber

Цитировать
Цитировать
Всё понятно... но как сделать, чтоб в то-же время картинки можноб было постить скажем и на isranet.info ?

все просто
просто данную директиву ты не прописываешь в корневом .htaccess, а в каждой папке, файлы которой ты хочешь защитить. таким образом ты создаешь одну папку, например PUB, куда скидываешь все то, что не хочешь защищать

Ну тогда уже наверное проще, кинуть .htaccess в корневик, а папки которые ты хочешь разширать, кидать такого рода файлик (сам не проверял):

<FilesMatch ".(gif|jpg|png)">
Order Allow,Deny
Allow from all
</FilesMatch>

И все ...... или даже <FilesMatch "*">

Yurist

#10
5-08-2004, 18:54 Последнее редактирование: 5-08-2004, 19:46 от Yurist
Пасиб...
Бум разбераться  ;)

Ещё вот что не прикольно:
Используя данную директиву (прописав свой домен в allowed) невозможным становится просмотр файлов в броузере не используя web формы... т.е. по прямому линку :(

Кста... уж не сочтите за назойливость  :D ...  и может не в тему...
Коим образом бесплатные хостеры (amillo, narod и т.д. и т.п.) прописывают автоматом свои банеры в страницы юзеров ?
Причем побарабану пыхыпы это... или html...
Эт тож .htaccess директивами ?

Опять-же.... если можно  :) ... на пальцах.

igor_ber
Цитировать
Ну тогда уже наверное проще, кинуть .htaccess в корневик, а папки которые ты хочешь разширать, кидать такого рода файлик (сам не проверял)


... а разве не будет достаточным прописать просто:
Order Allow,Deny
Allow from all

nanocoder

интересно, где можно прочитать про построение регулярных выражений в директивах как FilesMatch? Некоторые вещи просто понять по виду, но остальное :rolleyes:

imwerden

Приветствую!

Я столкнулся с проблемой, что мои pdf mp3 avi скачивают с каких-то серверов сотнями раз не заходя на страницу... Прописал запрет на внешние линки. Теперь, однако, начались проблемы у пользователей IE - при закачке pdf, если выбирается под правой кнопкой мыши "сохранить как" то пдф сохраняется как index (куда я послал все внешние линки). Как быть? перелапатил интернет и не нашел ответа. Я сам не пользуюсь уже 3-4 года IE, потому не сразу понял, что это проблема... Сейчас пока пришлось зарегить все ограничения...

Вверх