Как отключить горячие ссылки и прямые ссылки на файлы на моем сайте?

Хорошо, я уже несколько часов бью головой об стену, и это просто не работает. Ниже приведено содержимое моего файла.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-адрес напрямую и получить доступ к файлам. Это то, что я хотел бы предотвратить.

2 ответа

Проблема с первым отрывком может быть строкой 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.

Другие вопросы по тегам