解決Flask redirect生產(chǎn)環(huán)境上從https跳轉(zhuǎn)到http的問題

背景


項(xiàng)目使用了nginx作為反向代理队丝,從外部瀏覽器獲取到https再反向代理到本地的http乾胶。錯(cuò)誤配置文件如下

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('用戶名或密碼錯(cuò)誤')
        return redirect(url_for('.login'))

部署上線后预愤,使用https訪問,登錄后藏杖,地址被跳轉(zhuǎn)到http://bbs.u14e.xyz懂盐,由于沒有配80端口竭恬,所以這種情況會(huì)直接報(bào)錯(cuò)

原因


因?yàn)樯厦媾渲昧藥讉€(gè)proxy_set_header用來獲取客戶真實(shí)IP,使得flask redirect重定向的時(shí)候直接使用本機(jī)的協(xié)議熬的,瀏覽器控制臺(tái)查看響應(yīng)頭會(huì)看到Location: http://127.0.0.1:5000(還是不要?jiǎng)hproxy_set_header這些配置)

嘗試一


nginx添加80端口痊硕,使得redirect轉(zhuǎn)到http后,nginx再將http轉(zhuǎn)到https押框,443端口就可以將https轉(zhuǎn)給本機(jī)的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:這樣轉(zhuǎn)來轉(zhuǎn)去的顯然很糟糕。當(dāng)然最后還是要加上80端口的重定向的

嘗試二:


使用url_for

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

不過這樣的話橡伞,之前的代碼都要改一遍盒揉,而且開發(fā)環(huán)境不用https啊,還得手動(dòng)切換兑徘,多麻煩案沼!當(dāng)然可以封裝一下url_for挂脑,判斷開發(fā)和生產(chǎn)環(huán)境藕漱,但是感覺還是太麻煩了。

嘗試三:


參考:http://flask.pocoo.org/snippets/35/ 寫個(gè)中間件崭闲,看了時(shí)間谴分,年代久遠(yuǎn),還是不試了镀脂。

終極方案


nginx配置文件添加牺蹄,指定協(xié)議,參考: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生產(chǎn)環(huán)境 從https到http跳轉(zhuǎn)
    }
}

參考鏈接:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼎天,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暑竟,更是在濱河造成了極大的恐慌斋射,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件但荤,死亡現(xiàn)場離奇詭異罗岖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腹躁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門桑包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纺非,你說我怎么就攤上這事哑了∽阜剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵弱左,是天一觀的道長窄陡。 經(jīng)常有香客問我,道長拆火,這世上最難降的妖魔是什么跳夭? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮榜掌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乘综。我一直安慰自己憎账,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布卡辰。 她就那樣靜靜地躺著胞皱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪九妈。 梳的紋絲不亂的頭發(fā)上反砌,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音萌朱,去河邊找鬼宴树。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晶疼,可吹牛的內(nèi)容都是我干的酒贬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翠霍,長吁一口氣:“原來是場噩夢啊……” “哼锭吨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寒匙,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤零如,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锄弱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體考蕾,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年会宪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辕翰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狈谊,死狀恐怖喜命,靈堂內(nèi)的尸體忽然破棺而出沟沙,到底是詐尸還是另有隱情,我是刑警寧澤壁榕,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布矛紫,位于F島的核電站,受9級(jí)特大地震影響牌里,放射性物質(zhì)發(fā)生泄漏颊咬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一牡辽、第九天 我趴在偏房一處隱蔽的房頂上張望喳篇。 院中可真熱鬧,春花似錦态辛、人聲如沸麸澜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炊邦。三九已至,卻和暖如春熟史,著一層夾襖步出監(jiān)牢的瞬間馁害,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工蹂匹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碘菜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓限寞,卻偏偏與公主長得像炉媒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子昆烁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355