http2 在协议中显示 http1

Posted

技术标签:

【中文标题】http2 在协议中显示 http1【英文标题】:http2 shows http1 in protocol 【发布时间】:2017-06-02 07:22:11 【问题描述】:

我已经在 nginx 上使用“让我们加密”设置了 https,但目前还不清楚访问该站点时是否使用了 http2。

我通过添加启用 http2 听 [::]:443 ssl http2 default_server; 到 nginx 配置

当我在 Chrome 开发人员工具(查看 -> 开发人员 -> 开发人员工具)中检查站点的 https 协议并重新加载页面(查看 -> 重新加载此页面)时。然后导航到 Network 选项卡,单击以 Name 开头的表头行,右键单击它,然后选择 Protocol 选项。

它说 http/1.1 而不是 http2 的 h2。 但是对于通过 google.com 访问的我的 Google 字体,它显示的是 h2 当检查https://tools.keycdn.com/http2-test 的域时,它说该站点支持http2

当我跑步时 卷曲 --http2 -I https://example.com/ 我明白了 curl: (1) 不支持的协议

所以我在这里有点困惑。

我需要做更多的事情才能使它与 http2 一起工作吗?

这是我完整的 NGINX 配置文件:

server 
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

include snippets/ssl-www.example.com.conf;
include snippets/ssl-params.conf;

root /var/www/html;
index index.php index.html index.htm;

server_name example.com;

#Password protects the test subdomain
##  auth_basic "Restricted Content";
##  auth_basic_user_file /etc/nginx/.htpasswd;

location ~ /.well-known 
allow all;

location / 
try_files $uri $uri/ /index.php$is_args$query_string;
# include /etc/nginx/naxsi.rules

error_page 500 502 503 504 /50x.html;
location = /50x.html 
root /usr/share/nginx/html;

location ~ [^/]\.php(/|$) 
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) 
return 404;

# Mitigate https://httpoxy.org/ vulnerabilities
fastcgi_param HTTP_PROXY "";
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
include fastcgi_params;

location ~ \.php$ 
#match actual filename with extension or file not found
#try_files $uri $uri =404;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;


server 
listen [::]:80 default_server ipv6only=on;
listen 80 default_server;
server_name www.example.com;
return 301 https://example.com$request_uri;

为了您的信息,我在设置 Let's Encrypt 时遵循了本教程: digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04

nginx 版本:nginx/1.10.0 (Ubuntu 16.04)

我正在 Windows 10 最新版 Chrome 上进行测试

ssllabs.com/ssltest 显示: TLS 1.2 是 TLS 1.1 是 TLS 1.0 是 SSL 3 否 SSL 2 否

握手模拟 IE 11 / Win 10 R RSA 2048 (SHA256) TLS 1.2 > h2 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ECDH secp384r1 FS

协议详情: SSL 2 握手兼容性 是 HTTP 请求:(HTTP/1.1 200 OK) NPN 是 h2 http/1.1

【问题讨论】:

我通常使用这个 chrome 扩展来判断页面是否为 http/2。你能用它重新测试一下,看看它说了什么吗? chrome.google.com/webstore/detail/http2-and-spdy-indicator/… 你用的是哪个版本的openssl? @Faisal Memon Chrome 扩展只将谷歌字体列为 h2 而不是我的域。 @BazzaDP 啊Bitdefender 发布...!... :-) 看来你是对的... 谜团解开了!当我在 Bitdefender 中禁用 SLL 扫描时,我的网站现在显示 h2..!.. 所以代码一直都是正确的,只是我的防病毒程序......谢谢@BassaDP !!! 【参考方案1】:

对于仍在寻找但尚未阅读 cmets 的人:

尝试禁用 Bitdefender SSL 扫描Bitdefender 加密网络扫描

@BazzaDP 啊,Bitdefender 发布...!... :-) 看来你是对的... – 加布里埃尔 2017 年 1 月 29 日 8:54 1

谜团解开了!当我现在在 Bitdefender 中禁用 SLL 扫描时,我的网站 显示 h2 ..!.. 所以代码一直都是正确的,只是我的防病毒软件 程序...谢谢@BassaDP !!! – 加布里埃尔 2017 年 1 月 29 日 9:20

【讨论】:

以上是关于http2 在协议中显示 http1的主要内容,如果未能解决你的问题,请参考以下文章

HTTP2.0协议

http2和http1.1的性能差异对比

为啥说 HTTP2 是二进制协议?

当浏览器不支持 http2 时回退到 http1.1

http2.0技术介绍

详细分析http2 和http1.1 区别