modrewrite: замена в имени файла

Polkan
На сайте с 28.09.2005
Offline
102
761

Приветствую, товарищи!

Возникла необходимость защититься от хотлинков, но есть ряд сайтов, которым картинку отдавать все-таки надо (а то как-то нехорошо получится).

Решил отдавать им облегченную версию изображения.


Options +FollowSymLinks
RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_REFERER} ^http://.*\.livejournal\.com/?.* [NC]
RewriteCond %{REQUEST_FILENAME} .*\.jpg
RewriteRule ^(.*)\.jpg$ $1-small.jpg [L]

Не знаю почему, но оно не работает.

Если пишу полное перенаправление на другую картинку (заглушку)


RewriteRule ^(.*)$ http://fototelegraf.ru/ft.gif [L]

то все работает правильно, а вот замена только части имени файла не получается. :(

Указать полный путь (как во втором /рабочем/ варианте) возможности нет, потому что изображения НЕ лежат все в одном месте.

Лог апача говорит "File does not exist" и показывает путь до RewriteBase, т.е. какбэ все что я пытаюсь сделать в RewriteRule игнорируется или вроде того.

Подскажите, где косяк.

WordPress-плагин для Apishops (http://p-api-shop.ru/) P-API-Shop WooCommerce-плагин для Apishops (http://woo-apishops.ru/) Woo-Apishops
siv1987
На сайте с 02.04.2009
Offline
427
#1
то все работает правильно, а вот замена только части имени файла не получается.

Там же написано - файл не существует, как не получается?

Положите любой файл в корне под именем blabla-small.jpg, сделайте реврайт чтоб он был доступен без -small и всяких рефов, и смотрите открывается файл или нет.

RewriteRule (.+)(?<!-small)\.jpg $1-small.jpg [L]

Зы

А облегченная картинка точно есть?

Polkan
На сайте с 28.09.2005
Offline
102
#2
siv1987:
Там же написано - файл не существует, как не получается?
Положите любой файл в корне под именем blabla-small.jpg, сделайте реврайт чтоб он был доступен без -small и всяких рефов, и смотрите открывается файл или нет.

RewriteRule (.+)(?<!-small)\.jpg $1-small.jpg [L]

Зы
А облегченная картинка точно есть?

Ну дык я ж вижу, что там написано! :)

Странно не это, а то, по какому пути он его ищет!

Файл уменьшенный есть точно.

Если класть в корень, то все работает, как я уже писал выше.

Проблема в замене.

Может проблема в том, что он "зацикливается"? Начинает и новый файл снова обрабатывать по тем же правилам?

Пока решил вопрос костылями:

RewriteRule ^(.*)$ http://fototelegraf.ru/script/softhotlink.php?file=$1 [L]

из файла уже отдаю маленькую картинку.

Но не нравится мне такое решение. Скрипт этот запускать - тоже нагрузка лишняя. Хотелось бы реврайтом обойтись.

gormarket
На сайте с 29.12.2010
Offline
47
#3

строку

RewriteCond %{REQUEST_FILENAME} .*\.jpg

можно выкинуть (Вы все равно проверяете что это jpg в следующей строке), а вместо нее поставить проверку, что в имени запрошенного файла не содержится "-small".

Дело в том, что Вы преобразуете имя файла, добавляя в него "-small" и не меняя каталога файла.

И после третьей строки (с флагом [L]) у Вас запрашивается файл в том же каталоге и к нему снова применяются все строки из того-же файла .htaccess (если б Вы сменили каталог, файл .htaccess был бы другой), и в него еще раз добавляется "-small".

Поэтому, если преобразуется имя файла, но он остается в том же каталоге, важно не допустить повторного применения к имени файла уже примененного не предыдущем шаге преобразования.


RewriteCond %{HTTP_REFERER} ^http://.*\.livejournal\.com/?.* [NC]
RewriteCond %{REQUEST_URI} !.*-small\.jpg
RewriteRule ^(.*)\.jpg$ $1-small.jpg [L]
Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)
Polkan
На сайте с 28.09.2005
Offline
102
#4

gormarket, siv1987, спасибо. Все работает. Похоже, действительно он обрабатывал новый файл. Но самое забавное, что после пары попыток, меня тупо банил mod_evasive (я и забыл, что его ставил) и я в любом случае не видел картинок - то они есть, то их нет... вот ведь намучился. :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий