Хорошо, вот уже несколько часов я бью головой об стену, и это просто не работает. Ниже представлено содержимое моего файла .htaccess. Я пытаюсь заблокировать доступ к набору файлов pdf и mp3 на моем сайте, если пользователь не перейдет к этим файлам по ссылкам на страницах моего сайта.
Куда бы я ни посмотрел, код в основном такой же, как и тот, что я использую, но он просто не работает. Мои вопросы:
1) Я что-то не так делаю? 2) Если нет, то как мне отладить это?
# BEGIN CustomRedirects
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(mp3|pdf)$ - [F,NC,L]
# END CustomRedirects
Файлы mp3 и pdf не чувствительны к регистру, и включен mod_rewrite. На моем сайте установлен Wordpress, но он находится в более высоком каталоге в дереве, чем этот файл .htaccess. Из документации у меня сложилось впечатление, что мой файл .htaccess должен иметь приоритет, потому что он находится в каталоге, в котором я хочу выполнить эту перезапись. Если я испорчу этот файл .htaccess достаточно плохо, я получу ошибку 500, поэтому я могу только предположить, что он читается в какой-то момент.
Я также пробовал следующее, что я нашел из другого вопроса о сбое сервера, и это тоже не сработало:
SetEnvIf Referer . hotlink=1
SetEnvIfNoCase Referer ^http://(www\.)?mydomain\.com/.*$ !hotlink
<LocationMatch *.pdf>
Order allow,deny
Deny from env=hotlink
Allow from all
</LocationMatch>
У кого-нибудь есть идеи?
Обновить: Я также пробовал следующее для RewriteRule, но безрезультатно.
RewriteRule .*\.(mp3|pdf)$ - [F,NC,L]
Я обнаружил, что если я оставлю RewriteCond %{HTTP_REFERER} !^$
часть, он работает нормально, за исключением того факта, что кто-то все еще может ввести URL напрямую и перейти к файлам. Это еще кое-что, что я хотел бы предотвратить.
Проблема с первым отрывком может заключаться в строке RewriteRule.
Где у вас есть:
RewriteRule \.(mp3|pdf)$ - [F,NC,L]
возможно вы хотите:
RewriteRule .*\.(mp3|pdf)$ - [F,NC,L]
Как есть, я думаю, вы сопоставляете конкретные файлы «.mp3» или «.pdf». Вы хотите сопоставить 'foo.mp3' или 'bar.pdf' (для различных foo и bar).
По второму отрывку .. Начало выглядит подозрительно. Не знаю, зачем вам комбинация SetEnvIf и SetEnvIfNoCase. Возможно, попробуйте что-то вроде этого:
SetEnvIf Referer "^http://(www\.)?mydomain.com/.*$" legit_referal
SetEnvIf Referer "^$" legit_referal
<LocationMatch "\.(pdf|mp3)$" >
Order Deny,Allow
Deny from all
Allow from env=legit_referal
</LocationMatch>
То, что вы описываете, определенно возможно. Вы можете легко вернуть 403 запрещенный статус, если реферер не соответствует вашему собственному домену.
Вы также можете рассмотреть этот вариант: http://www.alistapart.com/articles/hotlinking/
Что касается вашего текущего кода, я заметил, что вы по ошибке пропустили обратную косую черту \, чтобы избежать. в mydomain.com.