如何防止文件直接访问URL?

夏期劇*_*期劇場 61 apache .htaccess mod-rewrite hotlinking

我正在使用Apache,我的本地主机上有一个示例Web文件夹,例如:

      http://localhost/test/
Run Code Online (Sandbox Code Playgroud)

文件test夹中的文件:

     index.html  
     sample.jpg  
     .htaccess  
Run Code Online (Sandbox Code Playgroud)

样本来源index.html:

<html>
  <body>
    <img src="sample.jpg" />
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

当我运行网站时http://localhost/test/,它只会在页面上显示图像`sample.jpg'.


问题:

  • 我想阻止图像http://localhost/test/sample.jpg直接显示在网址栏中.

注: 我发现下面的工作方案上的每个浏览器进行测试时,除了火狐.

Rus*_*pov 98

请尝试以下方法:

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

如果直接访问图像,则返回403,但允许它们在现场显示.

注意:当您打开带有图像的某个页面然后将该图像的路径复制到地址栏中时,您可以看到该图像,这只是因为浏览器的缓存,实际上该图像尚未从服务器加载(来自达沃,下面的完整评论).

  • 为什么是第一个`RewriteCond`?这种情况应该由第二个`.*$`指令覆盖? (2认同)

tuk*_*k0z 22

罗西波夫的规则很有效!

我在实时网站上使用它来显示空白或特殊消息;)代替对文件的直接访问尝试我宁愿保护一点不被直接查看.我觉得它比403 Forbidden更有趣.

因此,采用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]
Run Code Online (Sandbox Code Playgroud)

我认为这是一种礼貌的方式,不允许直接访问,例如,像xml,javascript这样的CMS 敏感文件 ......考虑到安全性:现在所有这些机器人都在网上乱写,我想知道他们的算法会从我的' messageforcurious'.


anu*_*ava 8

根据您的评论看起来这就是您所需要的:

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

我已经在我的localhost上测试了它,它似乎工作正常.


小智 8

首先,找到主apache的配置文件httpd.conf所在的位置.如果您使用Debian,它应该在这里:/etc/apache/httpd.conf.使用像Vim或Nano这样的文件编辑器打开此文件,找到如下所示的行:

Options Includes Indexes FollowSymLinks MultiViews
Run Code Online (Sandbox Code Playgroud)

然后删除单词索引并保存文件.该行应如下所示:

Options Includes FollowSymLinks MultiViews
Run Code Online (Sandbox Code Playgroud)

完成后,重启apache(例如在Debian中重启/etc/init.d/apache).而已!