我们目前正在使用webroot内的文件夹来存储图像和视频,这些图像和视频将在需要登录的 View 中(使用常用的html图像助手)加载。

如何防止外部访问者仅执行site.com/img/photos/1.jpg URL并可以访问图像?
据我了解,我不能真正使用媒体 View 在适当的 View 内渲染图像,也无法确定是否有通过htaccess操纵的解决方案。

哪个是最佳做法?
也许选择使用非webroot文件夹是最好的(尽管这会使文件存储部分变得更困难)?

正如poncha建议的那样,我尝试将主.htaccess文件编辑到此文件中

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteCond %{HTTP_REFERER} !localhost
   RewriteCond %{REQUEST_URI} ^app/webroot/img/
   RewriteRule .* / [L,F]
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

但是重写基线似乎禁止访问整个站点,没有它,似乎对img的访问没有任何改变。

编辑2:
在webroot中编辑htaccess:
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]

# this RewriteCond is needed to avoid rewrite loops
RewriteCond %{REQUEST_URI} !^/app/webroot/
RewriteRule (.*) app/webroot/$1 [L,R]


RewriteCond %{HTTP_REFERER} !127.0.0.1
RewriteCond %{REQUEST_URI} ^/app/webroot/img/
RewriteRule .* - [L,F]

</IfModule>

最佳答案

这将检查Referer http header 是否设置为包含您的域的内容,如果没有,则拒绝访问img/文件夹。

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_REFERER} !site.com
RewriteCond %{REQUEST_URI} ^img/
RewriteRule .* / [L,F]

注意:如果有人想要窃取您的内容,很容易“破坏”此保护,但是,它确实防止了热链接,而无需生成某种脚本,该脚本可以通过所有图像/视频来检查是否可以访问应该被授予。

编辑:

如果您的网站不在/中,则有两种选择:
  • 更改RewriteBase以反射(reflect)站点的基本uri(例如RewriteBase /app/webroot/)
  • 更改RewriteCond以反射(reflect)/(例如RewriteCond ^app/webroot/img/)的路径

  • 在您的情况下,首选第二个选项,因为那里还有其他规则

    编辑2:

    在您的情况下,整个集合应如下所示:
    RewriteEngine on
    RewriteBase /
    
    # this RewriteCond is needed to avoid rewrite loops
    RewriteCond %{REQUEST_URI} !^/app/webroot/
    RewriteRule (.*) app/webroot/$1 [L,R]
    
    RewriteCond %{HTTP_REFERER} !localhost
    RewriteCond %{REQUEST_URI} ^/app/webroot/img/
    RewriteRule .* - [L,F]
    

    关于image - 在cakephp 2.0中保护图像/视频文件夹,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11206432/

    10-11 22:43
    查看更多