到目前为止,我的PHP应用程序在任何地方都假设HTTP 1.1.因此,我定义了所有标题,例如: header("HTTP/1.1 500 Internal Server Error"); 但是现在我的服务器也支持HTTP 2,我想使用正确的HTTP状态代码更新所有标题. 如何获得HTTP请求的HTTP协议版本? (我的网络服务器是nginx,但我想如果我使用nginx或apache是无关紧要的.) 解决方案 服务器协议应通过SERVER_PROTOCOL从服务器环境中获得,通常在您的应用程序内通过$_SERVER['SERVER_PROTOCOL']暴露. 来自phpinfo() Apache 2.4: SERVER_PROTOCOL => HTTP/1.1 其他解决方案 更改/etc/nginx/factcgi_params: #fastcgi_param SERVER_PROTOCOL $server_protoco
以下是关于 http2 的编程技术问答
是否有一种方法强制PHP将HTTP2连接到另一台服务器,以查看该服务器是否支持它? 我尝试过: $options = stream_context_create(array( 'http' => array( 'method' => 'GET', 'timeout' => 5, 'protocol_version' => 1.1 ) )); $res = file_get_contents($url, false, $options); var_dump($http_response_header); 试验: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CUR
我在发送http/2 ruby中的邮政请求 但是我想用php 更新我的服务器 基于此处描述的新的Apple Push Notification http/2基于API: https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/remotenotificationpg/chapterspg/chapters/apnsproviderapi.html 拥有HTTP/2经验的任何人都可以帮助我在PHP中作为客户提出请求. 解决方案 php> = 5.5.24的卷曲扩展具有支持HTTP/2的支持. (由于您还需要安装一个libcurl(卷曲功能使用的基础库),并启用了HTTP/2支持.这意味着一个比7.38.0新的libcurl,但实际上,越早越好.必须使用http/2支持在编译时使用--with-nghttp2标志来明确启用libcurl. . 只需在通常使用时
我目前正在使用一个网站,该网站触发了Google Chrome上的A net::ERR_HTTP2_PROTOCOL_ERROR 200错误.我不确定是什么会引起此错误,我只是注意到它仅在访问HTTPS的网站时才弹出.我不能100%确定它是相关的,但是看起来它可以防止JavaScript正确执行. 例如,以下情况发生: 我正在访问https的网站 通过 https://publish.twitter.com 未加载在所有 我可以在控制台中注意到err_http2_protocol_error 如果我删除了加载Twitter feed的代码,则该错误仍保留 如果我访问HTTP中的网站,则会出现Twitter feed,并且错误消失了 Google Chrome是唯一触发错误的Web浏览器:它在Edge和Firefox上都很好地工作. (NB:我尝试了Safari,并且有类似的kcferrordomaincfnetwork 303错误) 我想知
我们的网站正在考虑切换到http2. 我的理解是, http2呈现优化技术,例如文件串联过时,因为使用HTTP2的服务器仅发送一个请求. 相反,我看到的建议是,最好保持文件尺寸较小,以便更有可能被浏览器缓存. 这可能取决于网站的大小,但是如果网站使用HTTP2并希望专注于缓存? ,网站的文件应该有多小? 在我们的情况下,我们的许多单独的JS和CSS文件落在1KB至180KB范围内. jQuery和Bootstrap可能更多.累积地,我们网站上一个页面的新下载通常不到900 kb. 所以我有两个问题: 这些文件尺寸是否足够小,可以被浏览器缓存? 如果它们足够小,可以缓存,那么对于使用不支持HTTP2的浏览器的用户来说,连接文件是否很好. 在这种情况下拥有较大的文件大小并使用http2会造成伤害吗?这样,它将使运行任一协议的用户受益,因为可以针对HTTP和HTTP2进行优化网站. . 解决方案 让我们澄清一些事情: 我的理解是http
遵循Wireshark的解密示例:我下载了捕获文件,但没有在该捕获文件的注释中看到键: 在Wireshark网站上,它说SSL键在评论中,但我只是没有看到它.还有另一种查看评论的方法吗?任何人都可以尝试链接文件: https://wiki.wireshark.org/uploads/__moin_import__/attachments/SampleCaptures/http2-16-ssl.pcapng 来自 File: http2-16-ssl.pcapng (HTTP2 with ALPN h2-16 extension) (5.1 KB, from https://git.lekensteyn.nl/peter/wireshark-notes/commit/tls/http2-16-ssl.pcapng?id=a24c03ce96e383faf2a624bfabd5cc843e78ab2a, SSL keys in capture file comments)
我正在使用NGHTTP2库将多部分框架格式化以与Alexa通信.我目前可以通过多部分消息获得音频的响应.但是,目前只能将数据发送到16KB,我想对我的录制数据进行流,这些数据可能大于整个16KB. 任何人都可以帮助我使用nghttp2? 将块中的音频数据发送到AVS 期待回复,请提供帮助. 谢谢. 此外,我还添加了代码中的参考功能.请忽略"惯例"的名称和其他逻辑,因为我只是尝试此垃圾以将数据发送到16kb大小上. //Callback function for the data to be send to the server ssize_t data_prd_read_callback_1(nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length,uint32_t *data_flags, nghttp2_data_source *source, void *us
我有一个看起来像这样的服务器: const http2 = require('http2'); const { HTTP2_HEADER_METHOD, HTTP2_HEADER_PATH, HTTP2_HEADER_STATUS, HTTP2_HEADER_CONTENT_TYPE } = http2.constants; const fs = require('fs'); const server = http2.createSecureServer({ key: fs.readFileSync('./ssl/localhost-privkey.pem'), cert: fs.readFileSync('./ssl/localhost-cert.pem') }); server.on('error', (err) => { console.error(err); }); server.on('stream', (st
我正在尝试测试微服务,并希望确保它与HTTP 2.0一起使用,因为这是必需的. 我们使用TestRestTemplate有很多测试,我想重复使用它们,但是我无法找到配置TestRestTemplate的方法来使用HTTP/2 ... 欢迎任何帮助. 解决方案 您可以使用@LocalServerPort private int localPort; @Autowired private RestTemplateBuilder restTemplateBuilder; private TestRestTemplate template; @PostConstruct public void initialize() { restTemplateBuilder .requestFactory(OkHttp3ClientHttpRequestFactory::new) .rootUri("http://localhost:" + localPort); this.templa
我网站的流量正在使用HTTP1.1,我想强迫服务器仅使用HTTP/2. 我正在运行Windows Server 2016和IIS10.我已经尝试添加 hkey_local_machine \ system \ currentcontrolset \ services \ http \ parameters EnableHttp2Tls: DWORD = 1 EnableHttp2ClearText: DWORD = 1 但仍在服务HTTP1.1. 我显然在这里错过了一些东西,但是我不确定是什么.我还要求什么吗? 解决方案 来自 serverfault : 下载并安装 url rewrite . 将以下内容添加到您的web.config文件中,部分: web.config
[![输入图像说明在这里] [1]] [1] 下面的图像具有命令 [1]: https://i.stack.imgur.com/ath9u.pn9u.png/a > 解决方案 http/2以三种方式之一进行协商: 作为使用HTTPS时设置的HTTPS的一部分 - 这是推荐的方法 在通过HTTP/1.1建立初始连接后,使用HTTP时作为升级.请注意,这很少使用,因此将在下一版本的http/2规格的下一个版本中弃用. 在http上直接使用http/2连接,如果您知道它可以通过告诉您的客户来支持http/2. 您使用的是http而不是https,所以第一个选项不可用. 因此,它使用了第二个选项.它确实使用了http/2-您可以在请求的下半年中看到.但是请参阅我关于弃用的笔记. 如果您想直接进入http/2 for curl,则可以使用--http2-prior-knowledge命令行选项.
const spdy = require("http2"); const zlib = require("zlib"); let payload = ">" const client = spdy.connect("https://>"); let outdata = ''; const req = client.request({ ":authority": ">", ":method": "POST", ":scheme": "https", ":path": ">", "accept-encoding": "gzip" }); req.setEncoding('utf8'); req.on("data", chunk => { chunk = chunk.toString("utf-8"); outdata +=
我正在尝试在节点中运行以下示例.它使用http/1.1正确运行,但使用http2失败: // Get an HTTP/1.1 tunnel: const req = http.request({ method: 'CONNECT', host: proxy.host, // This is a remote proxy which works properly with http/1.1 port: proxy.port, path: 'example.com' }); req.end(); const tunnelledSocket = await new Promise((resolve) => { req.on('connect', (_res, socket) => resolve(socket)); }); // We can now read/write to our raw TCP socket to example.com: const cl
如何执行Faraday adapter 使用http/2作为支持http/2的服务器的请求? 我已经对此进行了测试 https://http2.pro/doc/api/api ,结果就是这样. : body="{\"http2\":1,\"protocol\":\"HTTP\\/2.0\",\"push\":0,\"user_agent\":\"Faraday v0.12.2\"}", \"http2\":1, http/2不用于请求! 是什么意思! 解决方案 这里有两件事.首先是远程API在响应主体中向您撒谎.他们的文档说: http2:可能的值为0(使用HTTP/2)和1(未使用HTTP/2). 即使响应主体显示'http2': 1表示未使用HTTP2, IS 被使用.您最容易使用Chrome的Dev工具确认这一点: 因此,一旦我们知道API位于响应体中,我们如何独立确认Typhoeus使用HTTP2? (此答案假设您使用pry作为您的re
由于我启用了IIS的HTTP2协议,但是主要JavaScript文件的请求仍在排队.根据Chrome对排队的解释,我真的不知道是什么原因. 您可以在这里检查:排队: 解决方案 http/2表示更多资产可以一次下载 - 不是他们 will be. 浏览器对下载和何时下载有各种启发式方法. 例如,如果CSS文件需要图像,则在下载和处理CSS文件之前无法请求该图像(忽略预紧额).因此,在这种情况下 另一个问题是标签可以更改页面的内容,因此除非将其明确标记为async(或defer),否则是"渲染阻止".这意味着直到运行标签,任何JavaScript都不会在页面下方运行.现在,一个浏览器可以向前扫描并下载未来脚本,并且直到需要(如果需要的话)需要下运行它们,并且如果实际上不需要脚本,则略有风险,即浪费了下载.这取决于浏览器,也许Chrome认为这样做是不值得的. 查看您的特定网站,您的主页看起来基本上仅由脚本标签组成.您可以研究我
我正在阅读 背景 规格建立了两个条件,允许连接重复使用: 对于没有TLS的TCP连接,这取决于主机已解决到同一IP地址. 和 对于HTTPS资源,连接重用另外还取决于拥有 对URI中的主机有效的证书 如果连接中使用的证书具有多个subjectAltName或任何subjectAltName是通配符,则可以将连接重复用于任何具有subjectAltName s或hostName的请求的连接匹配任何通配符. 规格中的特定示例 在某些部署中,重用多个起源的连接可以 导致请求直接直接到错误的原始服务器.为了 例如,TLS终止可能由使用 TLS服务器名称指示(SNI)[tls-ext]扩展名 原始服务器.这意味着客户可以发送 向服务器的机密信息可能不是预期的 即使服务器是其他的,该请求的目标 权威. 请说明我对这个示例的理解是错误的: 将HTTPS连接建立到具有域x.com的请求的中间箱. Middlebox具有IP地址1.2.3.4和x.
git克隆可以从http2中受益? 我总是更喜欢SSH而不是HTTP(S),因为各种网络错误,但SSH似乎比HTTP(S)快一点.因此,我的问题是:Git,尤其是克隆可以从HTTP2 S多路复用功能中受益吗? 解决方案 智能协议 http上使用了一些长期运行的请求; http/2在这里不会显着受益. 相比之下,愚蠢协议提出了更多独立的要求,并且可以受益.但是: 如今,愚蠢协议很少使用.很难确保或私密,因此大多数GIT主机(基于云和本地)都会拒绝使用它. 实际上,在没有设计新协议来利用HTTP/2的情况下,我希望SSH继续给出最佳结果. 其他解决方案 此(HTTP2支持)在中没有太多讨论.邮件列表. 仅出现 是大约a GSOC 2015 2015年有关Git Fetch fetch :: 由于HTTP限制和无状态决定,发送了许多数据 在智能-HTTP的协商期间来回来回.我想知道 如果我们可以在CGI计划中实施"长投票"计划.这 程序终止H
我正在尝试让H2(HTTP/2)在我的网络服务器上工作.通过" Ondrej"存储库安装了Apache 2.4.20.我在Debian 8和Ubuntu 14.04服务器上进行了测试,但我一直遇到相同的问题.我有OpenSSL 1.0.2,并且正在运行SSL VHOST. 奇怪的是,发送了升级标头(连接:升级和升级:H2).当我进行一些外部服务器测试时,我会得到H2在ALPN支持下正常运行的响应.但是问题是我在(Win7上的Chrome和Firefox)上测试的浏览器不会升级到H2. 我注意到缺少的一件事是http/2-settings标头,但是我在任何Apache文档中找不到任何东西来实现此功能或强迫Apache发送此标头. 可悲的是,我无法使用卷发测试,因为我可以访问的服务器不支持任何具有HTTP/2支持的版本. 我的SSL VHOST设置: Protocols h2 http/1.1 SSLEngine On SSLCACertificateFile
我是Nginx的新来者(过去一直在使用Apache). 目前,我正在尝试设置一个将限制Apache后端的缓存,最终我认为(基于我的NGINX的良好经验),我们将切换到仅使用Nginx. 我一旦打开HTTP2 Safari就无法得到回应.在错误日志中,没有什么可以指示问题的,如果我打开访问日志并检查那里,我可以看到Safari客户端可以执行许多连接,就像它只是在不断刷新页面. 我已经尝试了许多NGINX版本,因为我注意到最新稳定的可能存在问题.因此,我尝试将降级至1.9.14,并升级到1.11.1,这也没有运气. nginx仅以: 来编译 ./configure --with-http_ssl_module --with-http_v2_module nginx -v输出: nginx version: nginx/1.11.1 built by gcc 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1) built