根 Flask 应用程序路由在生产中被禁止访问 403(nginx、uwsgi)

root Flask app route hits 403 forbidden in production (nginx, uwsgi)

基本上我有一个 views.py,里面有我所有的路线。他们都在生产上工作得很好,除了一个......根位置的主页'/'

来自views.py

@app.route('/', methods = ['GET'])
def homepage():

    return render_template("/client/homepage.html")

@app.route('/admin/', methods = ['GET'])
@login_required
def admin():

    submissions = Campaign.query.all()

    return render_template("admin.html",
        title = 'Admin',
        submissions = submissions)

我没有显示页面,而是收到 403 禁止消息。

来自 nginx 日志:

directory index of "/srv/www/cc/app/" is forbidden

有人知道我的 flask 路由有什么问题会导致行为从“/admin/”变为“/”吗?

编辑

我在网上找到了很多关于这个问题的帖子,其中一个建议是在 nginx 中打开自动索引。我这样做了,它给了我一个根位置的目录......这让我觉得问题可能是 nginx 根本没有将请求传递给 uwsgi。但我不确定该怎么做。

原来这是我写 nginx.conf 的方式。

在阅读 try_files 上的文档后,我发现我需要简单地添加

error_page 403 = @cc;

到我的位置块。原因显然是 try_files 指令将尝试按照列出的顺序直接匹配每个请求,所以在我的例子中,我的位置 @cc 是最后一个。 Nginx 正在根据 $uri 找到 / 且仅 / 的匹配项,然后尝试相应地显示页面。因为我的所有 uwsgi 东西都在我的@cc 位置,所以我不得不使用 error_page 403 = @cc; 将请求重定向到那里。位.

这是最终产品:

nginx.conf

server {
    listen      80;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 5M;
    root /srv/www/cc/app;

    location / { 
        try_files $uri $uri/ @cc;
        error_page 403 = @cc;
    }
    location /uploads/ {
        expires max;
    }
    location /static/ {
        expires max;
    }
    location @cc {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi.sock;
    }
}

我也遇到了同样的问题。在我的例子中,不幸的是 yarn-build 失败了,build 文件夹什么也没有!。 因此,重新运行 yarn-build 并解决了问题

可能对遇到此类问题的人有所帮助。