鍍金池/ 問答/Python  Linux/ nginx 301跳轉(zhuǎn)到帶,的鏈接

nginx 301跳轉(zhuǎn)到帶,的鏈接

訪問 [https://www.oyohyee.com/admin]
會301重定向到 [http://www.oyohyee.com,www.oy...]
使用curl -IL https://www.oyohyee.com/admin
得到如下信息

HTTP/1.1 301 MOVED PERMANENTLY
Server: nginx/1.12.2
Date: Thu, 12 Apr 2018 00:45:21 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 297
Connection: keep-alive
Location: http://www.oyohyee.com,www.oyohyee.com/admin/

(這里是nginx進行的跳轉(zhuǎn),同時跳轉(zhuǎn)后的鏈接是http協(xié)議)

初步判斷是nginx的問題,但是不知道應(yīng)該怎么解決,并且很好奇為什么會有這個跳轉(zhuǎn)

希望能夠按照flask規(guī)則跳轉(zhuǎn)到[https://www.oyohyee.com/admin/]


相關(guān)信息如下:

centos + nginx + gunicorn + flask

flask路由函數(shù)

@app.route('/admin/')
def admin():
    return render_template("admin/admin.html")

flask重定向規(guī)則

唯一 URL / 重定向行為
Flask 的 URL 規(guī)則基于 Werkzeug 的路由模塊。這個模塊背后的思想是基于 Apache
以及更早的 HTTP 服務(wù)器主張的先例,保證優(yōu)雅且唯一的 URL。 以這兩個規(guī)則為例:

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about') def about():
    return 'The about page' 

雖然它們看起來著實相似,但它們結(jié)尾斜線的使用在 URL 定義 中不同。 第一種情況中,指向 projects 的規(guī)范 URL 尾端有一個斜線。這種感覺很像在文件系統(tǒng)中的文件夾。訪問一個結(jié)尾不帶斜線的 URL 會被
Flask 重定向到帶斜線的規(guī)范 URL 去。 然而,第二種情況的 URL 結(jié)尾不帶斜線,類似 UNIX-like
系統(tǒng)下的文件的路徑名。訪問結(jié)尾帶斜線的 URL 會產(chǎn)生一個 404 “Not Found” 錯誤。 這個行為使得在遺忘尾斜線時,允許關(guān)聯(lián)的
URL 接任工作,與 Apache 和其它的服務(wù)器的行為并無二異。此外,也保證了 URL 的唯一,有助于避免搜索引擎索引同一個頁面兩次。

nginx log信息

 "HEAD /admin HTTP/1.1" 301 0 "-" "curl/7.29.0" "-"

nginx配置信息

server {
    listen       80;
    server_name www.oyohyee.com;
    rewrite ^(.*)$  https://$host$1 permanent;
}

server {
    listen       443 ssl http2 default_server;
    server_name www.oyohyee.com;

    ssl_certificate "/etc/nginx/ssl/1_www.oyohyee.com_bundle.crt";
    ssl_certificate_key "/etc/nginx/ssl/2_www.oyohyee.com.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location ^~ / {
        proxy_pass              http://127.0.0.1:8000/;
        proxy_redirect          off;
        proxy_set_header        Host $host;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-Host $server_name;
        proxy_set_header        Host $http_host;
    }

    location ^~ /static/ {
         root  /data/OBlog/OBlog/front/;
    }
}
回答
編輯回答
還吻

1、301跳轉(zhuǎn)的Location的域名重復(fù)并且多了一個逗號的原因是,nginx反代時多了一個Host

        proxy_set_header        Host $host;
        proxy_set_header        Host $http_host;

去掉下方的即可


2、另外你得讓Python代碼知道協(xié)議是https

1) 試下在nginx添加這兩個頭部

proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;

2) 如果無效,還需要調(diào)整一下代碼,讀取請求的X_Forwarded_Proto頭部來獲取協(xié)議
參考代碼:

from flask import Flask
from werkzeug.contrib.fixers import ProxyFix

app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
2017年10月17日 12:24