解决Flask redirect生产环境上从https跳转到http的问题

背景


项目使用了nginx作为反向代理,从外部浏览器获取到https再反向代理到本地的http。错误配置文件如下

server {
    listen 443 ssl;
    # 启用ssl
    ssl on;
    
    server_name    bbs.u14e.xyz;

    # 证书和私钥的地址  
    ssl_certificate /var/www/u-bbs/u14exyz/full_chain.pem; 
    ssl_certificate_key /var/www/u-bbs/u14exyz/private.key;

    location /images {
        alias /var/www/u-bbs/app/images;
    }

    location /static {
        alias /var/www/u-bbs/app/static;
    }

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

flask redirect代码如下:用户登录成功后重定向到首页

@bp.route('/login', methods=['POST'])
@csrf_required
def login_post():
    form = request.form
    u = User.validate_login(form.to_dict())
    if u is not None:
        session['user_id'] = u.id
        session.permanent = True
        return redirect('/')
    else:
        flash('用户名或密码错误')
        return redirect(url_for('.login'))

部署上线后,使用https访问,登录后,地址被跳转到http://bbs.u14e.xyz,由于没有配80端口,所以这种情况会直接报错

原因


因为上面配置了几个proxy_set_header用来获取客户真实IP,使得flask redirect重定向的时候直接使用本机的协议,浏览器控制台查看响应头会看到Location: http://127.0.0.1:5000(还是不要删proxy_set_header这些配置)

尝试一


nginx添加80端口,使得redirect转到http后,nginx再将http转到https,443端口就可以将https转给本机的http了,如图:登录成功流程

image.png

server {
    listen 80;
    server_name bbs.u14e.xyz;
    location / {
        # redirect any requests to the same URL but on https
        return 301 https://$host$request_uri;
    }
}

PS:这样转来转去的显然很糟糕。当然最后还是要加上80端口的重定向的

尝试二:


使用url_for

return redirect(url_for('topic.index', _scheme="https", _external=True))

不过这样的话,之前的代码都要改一遍,而且开发环境不用https啊,还得手动切换,多麻烦啊!当然可以封装一下url_for,判断开发和生产环境,但是感觉还是太麻烦了。

尝试三:


参考:http://flask.pocoo.org/snippets/35/ 写个中间件,看了时间,年代久远,还是不试了。

终极方案


nginx配置文件添加,指定协议,参考:http://flask.pocoo.org/docs/1.0/deploying/wsgi-standalone/#proxy-setups

proxy_set_header X-Forwarded-Proto $scheme;

然后就可以了,可以了,可以了,是不是so easy~~~哈哈哈,只需要改一下nginx配置

最后附上nginx配置完整版


server {
    listen 80;
    server_name bbs.u14e.xyz;
    location / {
        # redirect any requests to the same URL but on https
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    # 启用ssl
    ssl on;
    
    server_name    bbs.u14e.xyz;

    # 证书和私钥的地址  
    ssl_certificate /var/www/u-bbs/u14exyz/full_chain.pem; 
    ssl_certificate_key /var/www/u-bbs/u14exyz/private.key;

    location /images {
        alias /var/www/u-bbs/app/images;
    }

    location /static {
        alias /var/www/u-bbs/app/static;
    }

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; # fix flask redirect生产环境 从https到http跳转
    }
}

参考链接:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352