7

着信トラフィックを https にリダイレクトしようとすると、無限のリダイレクト ループが発生します。

@app.route('/checkout/')                                                                                                                                                                                        
def checkout():                                                                                                                                                                                                 
    checkout = "https://myapp.herokuapp.com/checkout/"                                                                                                                                              
    if checkout != request.url:                                                                                                                                                                             
        print checkout, request.url                                                                                                                                                                             
        return redirect(checkout)                                                                                                                                                                               
    return render_template('checkout.html', key=keys['publishable_key']) 

request.url がプレフィックス https に変更されることはありません。コストを最小限に抑えるために、heroku のピギーバック SSL を使用したいと考えています。

4

7 に答える 7

15

1)「pip install Flask-sslify」を実行します

(github はこちら: https://github.com/kennethreitz/flask-sslify )

2) 次の行を含めます。

from flask_sslify import SSLify
if 'DYNO' in os.environ: # only trigger SSLify if the app is running on Heroku
    sslify = SSLify(app)
于 2014-03-03T02:23:05.047 に答える
7

Herokuでは、SSL(https)はアプリケーションに到達する前に終了するため、アプリが実際にSSLトラフィックを確認することはありません。x-forwarded-protohttpsでリクエストが行われたかどうかを確認するには、代わりにヘッダーを調べる必要があります。詳細はこちら:Heroku httpsでのみPythonを作成する方法は?

更新:使用するには、request.urlで「myapp.herokuapp.com/checkout/」を確認する必要があります。ヘッダーが「https」であることを確認します

于 2013-02-27T16:08:01.137 に答える
6

SSLify、url_for _scheme、および Preferred_URL_SCHEME の設定を試しました。しかし、少なくともリリースレベルでは、どれもうまくいきませんでした..(ローカルではうまくいきました)それから私は考えました;

@app.before_request
def beforeRequest():
    if not request.url.startswith('https'):
        return redirect(request.url.replace('http', 'https', 1))

これは基本的に、構成や拡張機能なしで実行する別の方法です。

于 2015-03-13T07:11:31.210 に答える
0

単一のビュー用にフラスコ sslify コードを転用することができました。要求が SSL で行われているかどうかを確認し、応答に適切なヘッダーを追加するだけで済みました。https://github.com/kennethreitz/flask-sslify

@app.route('/checkout/')                                                                                                                                                                                        
def checkout():                                                                                                                                                                                                 
    checkout = "https://myapp.herokuapp.com/checkout/"                                                                                                                                              
    if request.headers.get('X-Forwarded-Proto', 'http') == 'https':                                                                                                                                             
        resp = make_response(render_template('checkout.html', key=keys['publishable_key']))                                                                                                              
        return set_hsts_header(resp)                                                                                                                                                                            
    return redirect(checkout, code=302)                                                                                                                                                                         

def set_hsts_header(response):                                                                                                                                                                                  
    """Adds HSTS header to each response."""                                                                                                                                                                    
    response.headers.setdefault('Strict-Transport-Security', hsts_header)                                                                                                                                       
    return response                                                                                                                                                                                             

def hsts_header():                                                                                                                                                                                              
    """Returns the proper HSTS policy."""                                                                                                                                                                       
    hsts_policy = 'max-age={0}'.format(31536000) #year in seconds                                                                                                                                               
    if self.hsts_include_subdomains:                                                                                                                                                                            
        hsts_policy += '; includeSubDomains'                                                                                                                                                                    
        return hsts_policy 
于 2013-02-27T17:26:14.403 に答える
0

X-Forwarded-Protoヘッダーを確認するだけです。false の場合は、同等の https URL にリダイレクトします。

heroku で実行されているフラスコ アプリのすべての呼び出しに対して https を強制するコードは次のとおりです。

@app.before_request
def enforceHttpsInHeroku():
  if request.headers.get('X-Forwarded-Proto') == 'http':
  url = request.url.replace('http://', 'https://', 1)
  code = 301
  return redirect(url, code=code)
于 2018-02-15T12:16:46.543 に答える