一个为纯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 |