You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置Flask站点在子目录而非根目录运行的问题

解决Flask站点在Nginx+uWSGI下子目录运行的404问题

我之前也遇到过完全一样的问题——想让Flask站点跑在Nginx的子目录下,改了location之后直接404,其实光改Nginx是不够的,得同步调整Flask和uWSGI的配置,下面一步步来解决:

步骤1:修改Nginx配置

你之前只改了location的路径,但没告诉Flask它的根路径前缀,也没处理请求路径的转发逻辑。更新你的/etc/nginx/sites-available/myproject配置:

server {
    server_name mydomain www.mydomain;
    # 注意路径末尾带斜杠,匹配所有/myproject下的子路径
    location /myproject/ {
        include uwsgi_params;
        # 关键:告诉Flask应用的脚本路径前缀
        uwsgi_param SCRIPT_NAME /myproject;
        uwsgi_pass unix:/root/Desktop/myproject/myproject.sock;
        # 让uWSGI自动去掉请求路径中的/myproject前缀,传给Flask的是干净的路径
        uwsgi_modifier1 30;
    }
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mydomain/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
    if ($host = www.mydomain) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
    if ($host = mydomain) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
    listen 80;
    server_name mydomain www.mydomain;
    return 404; # managed by Certbot
}

步骤2:调整Flask应用的路由前缀

有两种简单的方法让Flask识别子目录前缀:

方法一:设置APPLICATION_ROOT(推荐)

在你的Flask应用代码里,初始化app时加上APPLICATION_ROOT配置:

from flask import Flask

app = Flask(__name__)
# 告诉Flask它的根路径是/myproject
app.config['APPLICATION_ROOT'] = '/myproject'
# 可选:关闭严格斜杠检查,避免/myproject和/myproject/的路由冲突
app.url_map.strict_slashes = False

# 你的路由定义
@app.route('/')
def index():
    return "Hello from /myproject!"

这样url_for生成的链接也会自动带上/myproject前缀,不会出错。

方法二:用Blueprint统一挂载前缀

如果不想修改全局app的配置,可以把所有路由注册到一个Blueprint上,指定前缀:

from flask import Flask, Blueprint

# 创建Blueprint,指定url前缀为/myproject
main_bp = Blueprint('main', __name__, url_prefix='/myproject')

# 所有路由都注册到这个Blueprint上
@main_bp.route('/')
def index():
    return "Hello from /myproject!"

@main_bp.route('/about')
def about():
    return "About page under /myproject"

# 初始化app并注册Blueprint
app = Flask(__name__)
app.register_blueprint(main_bp)

步骤3:更新uWSGI配置

修改你的config.ini,加上manage-script-name选项,确保uWSGI正确处理Nginx传来的SCRIPT_NAME参数:

[uwsgi]
module = server:app
master = true
processes = 5
socket = myproject.sock
chmod-socket = 660
vacuum = true
die-on-term = true
# 启用脚本名称管理,配合Nginx的配置
manage-script-name = true
route-run = fixpathinfo:

最后重启服务测试

修改完所有配置后,重启Nginx和uWSGI让配置生效:

# 重启Nginx
sudo systemctl restart nginx

# 重启uWSGI(如果用systemd管理的话,假设服务名为uwsgi@myproject)
sudo systemctl restart uwsgi@myproject

# 如果没有systemd服务,直接用uWSGI命令重启(先停止再启动)
uwsgi --stop myproject.pid
uwsgi --ini config.ini

现在访问https://mydomain/myproject应该就能正常加载你的Flask站点了,不会再出现404错误。

内容的提问来源于stack exchange,提问作者FreeMind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:38:16