簡體   English   中英

使用 Django 在 Google App Engine Flexible 上永久重定向 http 到 https

[英]Permanently Redirect http to https on Google App Engine Flexible with Django

我正在開發一個在 Python 3 靈活環境中使用 Django 使用 Google Cloud Platform 的 App Engine 的項目,我正在嘗試將所有路由的所有請求通過http永久重定向到https ,但到目前為止還沒有成功。 我可以通過https訪問該站點,但前提是明確寫在地址欄中。

我看過這篇文章: 如何將`http://`和`www.` URLs永久重定向到`https://`? 但沒有發現答案有用。

除了重定向之外,該應用程序在各個方面都能正常工作。 這是我的app.yaml文件:

# [START runtime]
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT myproject.wsgi

runtime_config:
  python_version: 3
# [END runtime]

myproject/settings.py我定義了這些變量:

SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_PROXY_SSL_HEADER = ('HTTP-X-FORWARDED-PROTO', 'https')

在我的本地機器上,當我將SECURE_SSL_REDIRECT設置為True ,我被正確重定向到https ,即使 localhost 不支持 SSL。 在生產中,我仍然可以僅使用http訪問該站點。

是否有什么我遺漏或做錯的事情導致重定向不發生?

在 app.yaml 中設置secure僅適用於 GAE 標准,但不適用於靈活。 靈活app.yaml 文檔根本沒有提到這個鍵。

您可能必須通過檢查X-Forwarded-Proto標頭的值在應用程序級別執行此操作。 如果對您的應用程序的請求來自 HTTPS,它將被設置為https 您可以在此處的文檔中的靈活環境中找到有關環境提供的標頭的更多信息。

確保您啟用了SecurityMiddlewareCommonMiddleware ,並分配一個Base_URL

settings.py

MIDDLEWARE_CLASSES = (
    ...
    'django.middleware.security.SecurityMiddleware'
    'django.middleware.common.CommonMiddleware',    
)

BASE_URL = 'https://www.example.com'

或者,您可以編寫自己的中間件:

MIDDLEWARE_CLASSES = (
    ...
    'core.my_middleware.ForceHttps',
)

BASE_URL = 'https://www.example.com'

my_middleware.py

from django.http import HttpResponsePermanentRedirect

class ForceHttps(object):

    def process_request(self, request):

        if not (request.META.get('HTTPS') == 'on' and settings. BASE_URL == 'https://' + request.META.get('HTTP_HOST') ):
            return HttpResponsePermanentRedirect(settings. BASE_URL + request.META.get('PATH_INFO'))
        else:
            return None

問題是標題名稱。 當通過 WSGI 服務器訪問 Django 時,您應該使用X-Forwarded-Proto標頭而不是HTTP_X_FORWARDED_PROTO

請參閱: 為什么 django 會忽略線路中的 HTTP_X_FORWARDED_PROTO 而不是在測試中?

我遇到了類似的問題,並在 app.yaml 和 settings.py 中嘗試了一些更改,用於自定義域(使用 GAE 提供的默認 ssl 證書)。

通過反復試驗,我發現在 settings.py 中將允許的主機更新到適當的域具有預期的結果:

ALLOWED_HOSTS = ['https://{your-project-name}.appspot.com','https://www.yourcustomdomain.com'] 

更新:我不再確定以上是原因,因為在隨后的部署中,上述內容被拒絕,並且我收到了主機錯誤。 但是重定向仍然存在...... :(

在此更改之前,我可以在地址欄中手動在 http:// 和 https:// 之間切換,現在它會自動重定向。

為了在測試時在 App Engine Flexible 和您的本地機器上都能正常工作,您應該在 settings.py 中設置以下內容

if os.getenv('GAE_INSTANCE'):
    SECURE_SSL_REDIRECT = True
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
else:
    # Running on your local machine
    SECURE_SSL_REDIRECT = False
    SECURE_PROXY_SSL_HEADER = None

這應該是您在使用應用引擎時確保重定向正確發生所需要做的全部工作。

注意:如果您使用的是舊式應用引擎 cron 作業(通過 cron.yaml),那么您將需要開始使用大大改進的雲調度程序。 App 引擎 cron 作業不正確支持重定向到 HTTPS,但您可以輕松地使用雲調度程序使其工作。

暫無
暫無

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

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