Web2py& nginx - 我必须设置静态文件夹

时间:2016-04-19 13:42:41

标签: authentication nginx web2py

我正在运行nginx / uWSGI并尝试使用'auth.requires_login()'(https://groups.google.com/forum/#!topic/web2py/0j92-sPp4bc)来锁定web2py网站,这样只有登录的用户才能访问它,甚至是/ static下的内容/。如果我用

设置nginx配置文件
location ~* /(\w+)/static/ {
        root /home/www-data/web2py/applications/;
}

按照文档中的建议,是否会绕过访问控制,并允许任何人查看静态内容?如果我将这一行留在配置文件之外,web2py是否仍会将静态内容共享给登录用户(虽然可能会慢一些)?

1 个答案:

答案 0 :(得分:1)

是的,使用该nginx规则将绕过web2py。删除它并让web2py处理/静态/赢得更改,因为这直接来自web2py手册:

  

http://127.0.0.1:8000/a/static/filename   没有名为" static"的控制器。 web2py将此解释为对名为" filename"的文件的请求。在子文件夹中"静态"应用程序" a"。   下载静态文件时,web2py不会创建会话,也不会发出cookie或执行模型。

因为没有控制器,所以不能直接使用auth.requires_login()来获取静态内容。这是因为/ static /中的文件通常不是访问控制的,否则浏览器将无法获得甚至呈现欢迎或登录页面所需的css,js等。

但是,如果您仍希望对静态文件(即私人pdf文件)进行站点范围的访问控制,您可以这样做:

  • 在您的应用程序目录中,创建一个名为 private_static
  • 的文件夹

然后在您的控制器中添加以下内容:

#default.py
import os

auth.requires_login()
def private_static():
    filename = os.path.join(*request.args)
    allowed = ['private1.pdf', 'private2.pdf']  # have some kind of validation for security!
    if not filename in allowed:
        raise HTTP(404)
    return response.stream(open(os.path.join(request.folder, 'private_static', filename)))

并在您看来如下:

<a href="{{=URL('private_static', args=['private1.pdf'])}}">Private Document</a>

现在访问http://.../private_static/private1.pdf将强制用户在获取静态文件之前登录。