我正在编写一个简单的应用程序,以确定某些网站是否支持http / 2。
根据我在草稿中阅读的内容:
https://tools.ietf.org/html/draft-ietf-httpbis-http2-07#section-3.2
我应该能够发出诸如
GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
Run Code Online (Sandbox Code Playgroud)
然后如果他们支持http / 2,则响应应为:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: HTTP/2.0
[ HTTP/2.0 connection ...
Run Code Online (Sandbox Code Playgroud)
我试图确切地了解HTTP2-Settings请求标头的值是什么。
我希望有人可以解释示例中应包含哪些信息。
所以我刚刚升级到支持HTTP2的nginx 1.9.5.
我全部换成listen spdy由listen http2,去除spdy_headers_comp指令也删除add_header Alternate-Protocol 443:npn-spdy/3;
然后我在Firefox中打开了我的网站,打开了网络监视器,瞧: Version: HTTP/2.0
但是Firefox如何知道我的网站支持HTTP2?在尝试HTTP1.1之前,它是否始终首先尝试通过HTTP2连接?
我知道大多数浏览器支持http/2加载页面,但这是否意味着我可以在使用XmlHttpRequest进行api调用时利用它?
更具体地说,我的问题是,如果我使用XmlHttpRequest进行2次调用来获取数据,是否确保它们都使用下面的相同tcp连接?我读过的任何文档都没有指明关于httpd支持XmlHttpRequest的任何内容,或者我如何显式打开http2连接,利用这个进行一些调用,然后关闭连接.
java中的okHttp,jetty和其他库提供了支持它的客户端库.但是javascript的支持还不清楚.
我的直觉是具有SPDY功能的浏览器会将其视为SPDY响应。但是,我能找到的最大保证是,H2响应将正常降级为HTTP1.1。我正在考虑以面向H2的方式(多个请求,没有域分片等)来提供资产,但是我确实需要支持某些非H2浏览器(例如Android 4.1的浏览器)。如果所有客户端都至少符合SPDY,我可以吗?
额外的问题:混合方案是否涉及任何并发症?我们正在使用不支持H2的Web框架,但是我正在考虑通过CDN提供大部分资产。假设使用TLS。
关于 CSS 和 JS 捆绑的一般建议是什么:将所有内容捆绑到一个文件中更好还是提供多个文件更好?
我个人认为多个文件更好,尤其是使用 http/2,但使用 bundle 是有充分理由的:当所有内容都在一个文件中时,缩小和 gzip 会产生更好的结果,因为在编写大量代码时通常会出现所有重复. 在另一端提供多个文件可改进缓存并允许并行下载,但在可能已缩小的文件之间包含相同的代码。
是否有任何好的统计数据可以比较多个文件和捆绑文件的文件大小、压缩大小和下载时间?
Stack Overflow 上已经有几个关于这个问题的主题,但我无法找到一个尽可能多地考虑 http/2 和 minification/gzip 的主题。
最近,一些浏览器支持HTTP/2. 此图显示所有版本的浏览器都支持HTTP/2
HTTP/2具有流量控制等新功能,可通过设置WINDOW_UPDATE帧实现.您知道哪个版本的浏览器支持流控制,并允许用户WINDOW_UPDATE通过javascript或其他方式配置框架
到目前为止我只使用 HTTP/1.1,但最近我切换到 HTTP/2。在 1.1 上,我遇到了请求数量限制问题,但 HTTP/2 使用一个连接与多路复用,这是否意味着我可以保持多个 SSE 通道打开而没有问题,还是应该只使用一个具有某些内部消息路由解决方案的通道?
我知道Java 9 提供的HTTP/2 客户端,并在尝试使用以下代码的孵化器模块时:
// Request builder
URI uri = new URI("http://www.stackoverflow.com/"); // using www.google.com gives me some payload with no exception
HttpRequest request = HttpRequest.newBuilder().uri(uri).GET().build();
// Client
HttpClient httpClient = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build();
System.out.println(httpClient.version());
// Response builder
HttpResponse response = httpClient.send(request, HttpResponse.BodyHandler.asString());
System.out.println("statusCode = " + response.statusCode()); // 200 for google.com
Run Code Online (Sandbox Code Playgroud)
我收到了这个作为输出:
Run Code Online (Sandbox Code Playgroud)Exception in thread "main" java.io.IOException: /192.168.0.2:60726: GOAWAY received at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.handleGoAway(Http2Connection.java:613) at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.handleConnectionFrame(Http2Connection.java:531) at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.processFrame(Http2Connection.java:466) at jdk.incubator.httpclient/jdk.incubator.http.internal.frame.FramesDecoder.decode(FramesDecoder.java:114) at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection$FramesController.processReceivedData(Http2Connection.java:152) at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.asyncReceive(Http2Connection.java:425) at jdk.incubator.httpclient/jdk.incubator.http.AsyncSSLDelegate.upperRead(AsyncSSLDelegate.java:557) at jdk.incubator.httpclient/jdk.incubator.http.internal.common.Queue.put(Queue.java:73) at …
我在 Ubuntu 16.04 上的 Nginx 后面托管了一个 asp.net net core 2.0 应用程序。
我的设置看起来像这样:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
...
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-Proto-Version $http2;
client_max_body_size 32m;
keepalive_timeout 200;
send_timeout 20;
client_body_timeout 50;
}
}
Run Code Online (Sandbox Code Playgroud)
我也有这些设置 Startup.cs
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto
});
Run Code Online (Sandbox Code Playgroud)
但仍然每次当我试图得到HttpContext.Connection.RemoteIpAddress它的回报127.0.0.1
我应该怎么做才能解决这个问题并获得真实的 IP 地址?
我在Node JS 10.9中将HAPI JS与HTTP / 2一起使用。当我使用此示例启动服务器时,
const fs = require('fs')
const Hapi = require('hapi')
const http2 = require('http2')
const server = new Hapi.Server()
server.connection({
listener: http2.createServer(),
host: 'localhost',
port: 3000
})
server.route({
method: 'GET',
path:'/hello',
handler: function (request, reply) {
return reply('Hello, World!')
}
})
server.start((err) => {
if (err) console.error(err)
console.log(`Started ${server.connections.length} connections`)
})
Run Code Online (Sandbox Code Playgroud)
我在控制台上收到此警告
(node:16600) ExperimentalWarning: The http2 module is an experimental API.
Run Code Online (Sandbox Code Playgroud)
我无法在互联网上找到有关是否可以在生产模式下使用它的相关解释?可以在生产模式下将HTTP / 2与此类警告一起使用吗?