一个为纯Django重定向响应添加HTTP/2服务器推送头的Django中间件
项目描述
Django HTTP/2服务器推送重定向
一个将HTTP/2服务器推送头添加到纯Django重定向响应的Django中间件。
此方法需要Django通过支持HTTP/2服务器推送的服务器进行代理。例如,nginx>=1.13.9
,apache2>=2.4.26
并启用mod_http2
,或者使用Cloudflare等CDN服务。
安装
此软件包在PyPI上可用,可以使用pip
进行安装。
pip install django-push-redirect
配置
首先配置您的Web服务器以启用HTTP/2并启用服务器推送。
对于nginx,这看起来像这样
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
...
location @python {
proxy_set_header X-Forwarded-Proto $scheme;
http2_push_preload on;
...
}
}
Apache和其他服务器/服务的配置留给读者练习(换句话说,我不知道,如果你做了,请贡献!)。
现在请确保Django能够通过配置SECURE_PROXY_SSL_HEADER
设置来检测请求是否安全,例如:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
然后将'push_redirect.middleware.Http2ServerPushRedirectMiddleware'
添加到项目的MIDDLEWARE
中,确保它位于Django的CommonMiddleware
之前。
MIDDLEWARE = [
...
'push_redirect.middleware.Http2ServerPushRedirectMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
此中间件会在需要预加载的重定向响应上添加Link rel=preload
头部。
如果一切配置正确,你应该会看到重定向不再需要额外的请求到web服务器。
响应取消选择
响应可以显式取消选择添加preload
头部。这是通过在response
对象上将allow_push_redirect
设置为False
来完成的,例如:
def opt_out(request):
response = HttpResponseRedirect("/")
response.allow_push_redirect = False
return response
灵感/参考文献
- https://twitter.com/simonw/status/1047865898717966337
- https://www.ctrl.blog/entry/http2-push-redirects
- https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/
- https://httpd.apache.ac.cn/docs/2.4/howto/http2.html#push
- https://www.cloudflare.com/website-optimization/http2/serverpush/
- https://code.djangoproject.com/ticket/29925
项目详情
关闭
django-push-redirect-1.1.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3c6f2402a5b9a7b4950b96677529a31a805268f3a67810a8b64cd767a5a89979 |
|
MD5 | 3ad37c757de60524dcc858aae5f10c42 |
|
BLAKE2b-256 | 5ab711fae3dd81b2f5ee69022ac140765d524a56d5e0fa36fecbf127753877ab |