簡體   English   中英

python flask 從 http 重定向到 https

[英]python flask redirect to https from http

我有一個使用 python3.4 和 flask 構建的網站...我已經生成了自己的自簽名證書,目前我正在通過本地主機測試我的網站。

我正在使用 python ssl 模塊以及這個 flask 擴展名: https://github.com/ke.nethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我查看了 sslify 源代碼,這一行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是 function 對 redirect_to_ssl 的調用(我在 redirect_to_ssl function 下添加了自己的打印語句,但我的語句從未打印過)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我對 python 很陌生。有什么想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

在應用引擎 flex 上,添加:

from werkzeug.middleware.proxy_fix import ProxyFix

def create_app(config=None):

    app = Flask(__name__)
    app.wsgi_app = ProxyFix(app.wsgi_app)

除了以下解決方案:

@app.before_request
def before_request():
    if not request.is_secure:
        url = request.url.replace('http://', 'https://', 1)
        code = 301
        return redirect(url, code=code)

否則,它會導致無限重定向,因為 SSL 在代理后面展開,但在標頭中注明。

利用:

app.run(port="443")

當端口為 443 或 8443 時,所有現代瀏覽器都會自動使用 HTTPS。

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

我有一個使用python3.4和flask的網站構建...我生成了自己的自簽名證書,目前正在通過本地主機測試我的網站。

我正在使用python ssl模塊以及此flask擴展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,這似乎不起作用。 我看了一下sslify源代碼,這行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特別是對redirect_to_ssl的函數調用(我在redirect_to_ssl函數下添加了自己的print語句,但從未打印過我的語句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法嗎?

在我的情況下,Flask 應用程序位於 AWS API Gateway 后面,@app.before_request 的解決方案給了我永久重定向。

以下簡單的解決方案終於奏效了:

@app.after_request
def adjust_response(response):
    ....
    if response.location:
        if app.env != "development":
            response.location = response.location.replace("http://", "https://", 1)
    return response

如果出於安全原因希望所有請求都為 HTTPS,則正確的方法稱為HSTS ,在Flask Docs 中提到了如何做到這一點:

response.headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'

https://flask.palletsprojects.com/en/2.0.x/security/#http-strict-transport-security-hsts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM