7

我有我的 django 由 apache 使用 Vhost 服务。conf文件如下

WSGIPythonPath /srv/www/myproject/testproject/


<VirtualHost *:80>
    ServerAdmin admin@betarhombus.com
    ServerName www.betarhombus.com
    WSGIScriptAlias / /srv/www/testproject/testproject/testproject/wsgi.py
    <Directory /srv/www/testproject/testproject/testproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    Alias /static/ /srv/www/testproject/testproject/static/
    Alias /media/  /srv/www/testproject/testproject/media/

    <Directory /srv/www/testproject/testproject/static>
        Require all granted
    </Directory>
    <Directory /srv/www/testproject/testproject/media>
        Require all granted
    </Directory>

</VirtualHost>

我想将媒体文件限制为仅在特定登录用户上提供。所以我遇到了 XsendFile。如果我理解正确,当您让 django 对您要提供的媒体文件进行所有检查时,它的作用是由 Apache 作为静态文件提供。所以如果我猜对了,程序如下

  1. 激活 XsendFile。
  2. 创建检查媒体文件权限等的视图并提供服务
  3. 与 urls.py 文件中的 url 关联

然后我可以使用 ` 并且会像使用初始媒体文件 url 一样正常工作。我理解正确吗?我的问题如下:

关于 1.activating XSendFile。这应该在我的 Vhost 标签内的 conf 文件中完成吗?设置 XsendFile 是否足够?我应该删除媒体指令的别名以及媒体文件的部分吗?我希望媒体文件仅由我的视图提供?

还有什么我应该注意的吗?

编辑:我的设置是

 <VirtualHost *:80>
    ServerAdmin admin@betarhombus.com
    ServerName www.betarhombus.com
    WSGIScriptAlias / /srv/www/testproject/testproject/testproject/wsgi.py
    XSendFile On
    XsendFilePath /srv/www/testproject/testproject/media/
    <Directory /srv/www/testproject/testproject/testproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    Alias /static/ /srv/www/testproject/testproject/static/
    <Directory /srv/www/testproject/testproject/static>
        Require all granted
    </Directory>
</VirtualHost>

我的网址.py

#for xsendmedia file serving
url(r'^media\/(?P<path>.*)$', 'customer.views.media_xsendfile'),

和我的看法

def media_xsendfile(request, path):  
    #here will be checked if user can access media
    response = HttpResponse()
    response['Content-Type']=''
    response['X-Sendfile']= smart_str(os.path.join(settings.MEDIA_ROOT, path))
    return response

我的问题是某些媒体文件可以正常共享,而有些则不能正常共享,并出现内部服务器错误

4

2 回答 2

5

还要确保在 Apache 配置文件中设置 XSendFilePath,如下所示,

XSendFile on
XSendFilePath "//path/to/files/on/disk"
<Directory "//path/to/files/on/disk">
    Order Deny,Allow
    Allow from all
</Directory>

并在返回响应时将其包含在您的视图中:

响应['X-Sendfile'] = smart_str(file_path)

并回答您的问题:

  • 激活 vhost 标签中的 XSendFile
  • 我已经在上面写了视图中还需要做什么
  • 我不确定您是否应该删除媒体别名,日志文件应该告诉您是否有问题
于 2014-07-08T12:20:58.533 回答
1

如果有人在使用较新版本的 Apache(2.4)时遇到同样的问题,这就是我最终设法使它工作的方法:

<VirtualHost *:80>
        XSendFile on
        
        Alias /static/ /mnt/mysite/static/
        Alias /media/ /mnt/mysite/media/

        <Directory /mnt/mysite/static>
                Require all granted
        </Directory>

        <Directory /mnt/mysite/media>
                Require all granted
        </Directory>

        <Directory /mnt/mysite/media/protected>
                Require all denied
        </Directory>
        XSendFilePath /mnt/mysite/media/protected

        <Directory /home/benbb96/mysite>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIDaemonProcess mysite python-home=/home/benbb96/mysite/venv python-path=/home/benbb96/mysite/
        WSGIScriptAlias / /home/benbb96/mysite/config/wsgi.py
</VirtualHost>

我在守护程序模式下使用 wsgi 运行我的网站(参见docs),我想保护一些在protected/中上传的媒体文件。所以我添加了一个<Directory>指令来阻止对它的访问,然后我在我的视图中使用XSendFile,它还验证用户是否有权访问该文件,以提供受保护的文件。

请注意,我的静态和媒体文件托管在网络 ( /mnt/) 的已安装文件夹上,但这不会导致任何问题。

于 2020-12-18T11:15:27.733 回答