Как запретить файлу прямой доступ по URL?

Я использую Apache, и у меня есть пример веб-папки на локальном хосте, например:

      http://localhost/test/

Файлы в test папке:

     index.html  
     sample.jpg  
     .htaccess  

Пример источника index.html:

<html>
  <body>
    <img src="sample.jpg" />
  </body>
</html>

Когда я запускаю веб-сайт по адресу http://localhost/test/, он просто показывает изображение "sample.jpg" на странице.


Проблема:

  • Я хочу, чтобы изображение, отображаемое как http://localhost/test/sample.jpg отображалось непосредственно в строке URL.

Примечание. Я обнаружил, что приведенные ниже решения работают при тестировании на всех браузерах, кроме Firefox.

Ответ 1

Попробуйте следующее:

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost.*$ [NC] 
RewriteRule \.(gif|jpg)$ - [F]

Возвращает 403, если вы напрямую обращаетесь к изображениям, но позволяет их отображать на сайте.

Примечание.. Возможно, когда вы открываете какую-то страницу с изображением, а затем копируете этот путь изображения в адресную строку, вы можете видеть это изображение, это только из-за кеша браузера, на самом деле это изображение не было загружено с сервера (из Даво, полный комментарий ниже).

Ответ 2

Правило rosipov отлично работает!

Я использую его на живых сайтах, чтобы отображать пустое или специальное сообщение;) вместо попытки прямого доступа к файлам я предпочел бы защитить бит от прямого просмотра. Я думаю, что это более забавно, чем Запрещенный 403.

Итак, беря правило rosipov для перенаправления любого прямого запроса на файлы {gif, jpg, js, txt} на 'messageforcurious':

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.ltd [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.ltd.*$ [NC] 
RewriteRule \.(gif|jpg|js|txt)$ /messageforcurious [L]

Я рассматриваю это как вежливый способ запретить прямое подключение к, скажем, CMS разумным файлам, таким как xml, javascript... с учетом безопасности. Для всех этих ботов, просматривающих веб-страницы в настоящее время, мне интересно, что сделает их algo из моего "messageforcurious".

Ответ 3

Прежде всего, найдите, где находится файл конфигурации httpad.conf главного apaches. Если вы используете Debian, он должен быть здесь: /etc/apache/httpd.conf. Используя некоторый редактор файлов, такой как Vim или Nano, откройте этот файл и найдите строку, которая выглядит следующим образом:

Options Includes Indexes FollowSymLinks MultiViews

затем удалите слова "Индексы" и сохраните файл. Строка должна выглядеть так:

Options Includes FollowSymLinks MultiViews

После этого перезапустите apache (например, перезапуск /etc/init.d/apache в Debian). Это оно!

Ответ 4

На основе ваших комментариев выглядит так, как вам нужно:

RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost/ [NC] 
RewriteRule \.(jpe?g|gif|bmp|png)$ - [F,NC]

Я тестировал его на своем локальном хосте, и он работает нормально.

Ответ 5

Когда я использовал его на своем веб-сервере, я могу переименовать только локальный хост, например так:

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

Ответ 6

В каком файле мы должны написать следующие строки?

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost.*$ [NC] 
RewriteRule \.(gif|jpg)$ - [F]