6

新しいリソースをRESTfulTastypieAPIにPOSTすると、リソースが作成され、次のような201応答が返されます。

HTTP/1.1 201 CREATED
Content-Type: text/html; charset=utf-8
Date: Wed, 19 Sep 2012 01:02:48 GMT
Location: http://example.com/api/v1/resource/12/
Server: gunicorn/0.14.6
Content-Length: 0
Connection: keep-alive

素晴らしい!LocationHTTPS URLに投稿し、HTTPSヘッダーを取り戻したい場合を除きます。これを行うためにtastypieを構成するにはどうすればよいですか?

添加

SSLを強制するためにミドルウェアを使用していますが、それがこの問題の原因ではないと思います。とにかくここにあります:

class SSLifyMiddleware(object):
    # Derived from https://github.com/rdegges/django-sslify
    def process_request(self, request):
        if not any((not settings.FORCE_SSL, request.is_secure(), request.META.get('HTTP_X_FORWARDED_PROTO', '') == 'https')):
            url = request.build_absolute_uri(request.get_full_path())
            secure_url = url.replace('http://', 'https://')
            return HttpResponseRedirect(secure_url)

添加

これはHerokuアプリです。

4

1 に答える 1

5

http私たちが決定したように、の代わりにで始まるURLの理由はhttpsです。request.is_secure()False

クライアントとロードバランサー/リバースプロキシ間の接続がSSLを使用して行われているのに、HTTPを使用してサーバーに接続するロードバランサーまたはリバースプロキシの背後にあるなど、request.is_secure()いくつかの理由が考えられます。False

SECURE_PROXY_SSL_HEADERプロキシまたはロードバランサーの背後にいる場合は、いくつかの解決策であるのドキュメントを参照してください。

ただし、Djangoアプリがプロキシの背後にある場合、プロキシは、プロキシとDjango間の非HTTPS接続を使用して、リクエストがHTTPSであるという事実を「飲み込んで」いる可能性があります。この場合、is_secure()は常にFalseを返します-エンドユーザーがHTTPS経由で行ったリクエストの場合でも。

この状況では、リクエストがHTTPS経由で着信したかどうかをDjangoに通知するカスタムHTTPヘッダーを設定するようにプロキシを構成し、Djangoが検索するヘッダーを認識できるようにSECURE_PROXY_SSL_HEADERを設定する必要があります。

于 2012-09-19T17:30:33.063 に答える