Apache 保护图像不受直接URL访问?

Apache 保护图像不受直接URL访问?,apache,.htaccess,hotlinking,Apache,.htaccess,Hotlinking,我目前正在使用php、apache服务器和symfony进行一个项目。我试图实现的是阻止我的图像通过URL栏直接访问。我已经试过使用选项All-Indexes,但它不起作用,我不知道我是否做错了什么,我也试过一些帖子中的东西,比如: RewriteEngine on RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost

我目前正在使用php、apache服务器和symfony进行一个项目。我试图实现的是阻止我的图像通过URL栏直接访问。我已经试过使用
选项All-Indexes
,但它不起作用,我不知道我是否做错了什么,我也试过一些帖子中的东西,比如:

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

选项包括以下索引ymlinks多视图

我还确信我的httpd.conf文件具有
AllowOverride All

我真的不知道还能做什么。我被困在这个问题上太久了,如果你看到我的解决方案中有任何错误,或者你有任何建议,我会非常感谢他们。提前谢谢

编辑


我确实想继续在我的站点中显示这些图像,但我不想让其他用户通过直接URL访问它们。

apache2.conf
中(至少我在其中测试过):


要求全部拒绝

注意:这将阻止对文件的访问,即使是从HTML文件中。在页面上显示它们的唯一方法是将它们包含在PHP中生成的HTML中。

我也有类似的问题,但在我的例子中,我使用了一些文件夹(上传)来保存用户上传的文件(个人资料图片等),然后我只需要为某些用户(帐户所有者和他的联系人)显示这些文件

我的解决方案: 1) 在security.yml中,关闭除超级管理员之外的所有用户的上载文件夹

security:
   access_control:
       - { path: ^/uploads/, role: ROLE_SUPER_ADMIN }
2) 如果您需要用户能够从服务器下载文件,请创建控制器来处理此问题

use Symfony\Component\HttpFoundation\BinaryFileResponse;

class DownloadController extends Controller
{
    public function downloadAction(Request $request, $filepath = null)
    {
        if ($filepath){
            $response = new BinaryFileResponse($filepath);

            return $response;
        }
    }
}

您想阻止对文件的访问,无论是什么,还是仅当文件直接从URL栏访问时?对不起,我在回答中假设了前者。没有可靠的方法可以做到这一点。这不值得费心。好吧,你可以用我的答案完全阻止访问。我假设OP将使用PHP或其他东西将文件加载到数据URI中,这样就永远不会使用图像的潜在URL。我也这么做,但我的URL仍然是公共的,未经授权的用户可以看到图像检查your security.yaml并确保您的控制器位于启用了安全性的防火墙后面。你下载行动的路径是什么?
security:
   access_control:
       - { path: ^/uploads/, role: ROLE_SUPER_ADMIN }
use Symfony\Component\HttpFoundation\BinaryFileResponse;

class DownloadController extends Controller
{
    public function downloadAction(Request $request, $filepath = null)
    {
        if ($filepath){
            $response = new BinaryFileResponse($filepath);

            return $response;
        }
    }
}