Tianhe Gao

Nginx 中在 80 端口添加 HTTP/2 出现问题

承接上篇文章通过 Nginx 让网站支持 HTTP/2,当我完成文章中的操作时,有一次我好奇网站 HTTP 是否能够自动跳转到 HTTPS,于是我输入 http://blog.yidajiabei.xyz/ ,意外发生了——没有跳转到 HTTPS,还下载了一个名字为 download 且文件类型为 application/octet-stream

我很意外,思考这是为什么。把这个问题记下来,过了几个小时,我从网络中找到答案:HTTP2 不需要加密,当然这只是肤浅的说法,一定还有深层次的理解。

通过这篇文章,我学到一条检查网站是否支持 HTTP/2 的命令:

1curl -I -k --http2 https://blog.yidajiabei.xyz/
2HTTP/2 200 
3server: nginx/1.18.0 (Ubuntu)
4date: Wed, 03 Nov 2021 00:37:29 GMT
5content-type: text/html
6content-length: 5254
7last-modified: Tue, 02 Nov 2021 23:37:46 GMT
8etag: "6181cbca-1486"
9accept-ranges: bytes

在这篇文章中,我找到了 Nginx 配置 HTTP/2 的方法:

 1http {
 2  server {
 3    listen 443 ssl http2;
 4    ssl_certificate    /path/to/server.cert;
 5    ssl_certificate_key /path/to/server.key;
 6    # ...
 7    # Copy from the HTTP server
 8    # ...
 9  }
10}

根据这一配置,再联系到 HTTP/2 不需要加密,那么是不是不能在 80 端口配置 HTTP/2 呢?也就是说,以下配置会造成无法由 HTTP 跳转到 HTTPS:

1http {
2  server {
3    listen 80 http2;
4    # ...
5  }
6}

当这一切都被修正时,HTTP 就能够跳转到 HTTPS 了。

最终我的 Server Block 配置为

 1http {
 2  server {
 3    listen 443 ssl http2;
 4    server_name www.yidajiabei.xyz;
 5    ssl_certificate    /path/to/server.cert;
 6    ssl_certificate_key /path/to/server.key;
 7    # ...
 8    # Copy from the HTTP server
 9    # ...
10  }
11  server {
12    listen 80;
13    server_name www.yidajiabei.xyz yidajiabei.xyz;
14    return 301 https://www.yidajiabei.xyz$request_uri;
15  }
16}

No notes link to this note

Welcome to tell me your thoughts via "email"
UP