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

Web2py & nginx - do I have to set up static folder

我是 运行 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 是否仍会向登录用户共享静态内容(尽管可能会慢一点)?

是的,使用那个 nginx 规则将绕过 web2py。删除它并让 web2py 处理 /static/ 也不会改变太多,因为这直接来自 web2py 手册:

http://127.0.0.1:8000/a/static/filename There is no controller called "static". web2py interprets this as a request for the file called "filename" in the subfolder "static" of the application "a". When static files are downloaded, web2py does not create a session, nor does it issue a cookie or execute the models.

所以因为没有controller,静态内容不能直接使用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 将强制用户在获取静态文件之前登录。