【问题标题】:Enforce HTTP/1.1 instead of HTTP/2强制执行 HTTP/1.1 而不是 HTTP/2
【发布时间】:2019-01-31 22:00:09
【问题描述】:

我在服务器上托管一个文件,该文件由 CocoaPods 作为 pod 的一部分获取。 CocoaPods 在内部使用 curl 来获取它。最新 macOS 10.14.2 (18C54) 中的 Curl 7.54.0 具有 a bug,这会导致通过 HTTP/2 获取的文件出现问题。这意味着使用我的 pod 的开发人员会因为 curl 错误而不断安装失败。

由于在 Cocoapods 中使用 curl,我无法为 curl 提供命令行开关(至少我不认为 Cocoapods 提供了这样做的方法)。

有什么方法可以使用 Apache 配置、htaccess 或 PHP 来强制执行 HTTP/1.1?

【问题讨论】:

    标签: php apache curl cocoapods


    【解决方案1】:

    您可以通过设置选项CURLOPT_HTTP_VERSION来决定使用哪个版本

    // default, lets CURL decide which version to use    
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_NON);
    
    // forces HTTP/1.0
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
    
    // forces HTTP/1.1    
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    

    【讨论】:

    • CURL_HTTP_VERSION_1_1 是一个具有长值的常量;它不是一个字符串。
    • 我没有在 PHP 中使用 curl,它被本地计算机上的 CocoaPods 使用。我在问我是否可以从 PHP 强制执行 HTTP/1.1。我不确定是服务器还是客户端决定了要使用的协议。
    【解决方案2】:

    cURL 有一个命令行开关-http1.1。在 PHP 中可能是:

    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    

    ...至少documentation 是这么说的。


    mod_rewrite也可以用来禁止HTTP/2.0(但不知道怎么切换):

    RewriteCond %{SERVER_PROTOCOL} ^HTTP/2\.0$ [NC]
    RewriteRule . [F,L]
    

    我认为虚拟主机配置是最可靠的(这在.htaccess 文件中不起作用):

    PolicyVersion enforce HTTP/1.1 
    

    【讨论】:

    • 我没有在 PHP 中使用 curl,它被本地计算机上的 CocoaPods 使用。我在问我是否可以从 PHP 强制执行 HTTP/1.1。我不确定是服务器还是客户端决定了要使用的协议。
    • @Nick 添加了更多选项。两者,服务器和客户端都可以坚持一个协议版本,其中通常正在协商最好的可用(两者都支持),除非强制执行较低的版本。
    • 我发现了 PolicyVersion,但我认为我无法使用它,因为我无权访问 vhost 配置:/
    • @Nick 您可以迁移到根服务器 - 或要求人们将 -http1.1 添加到 ~/.curlrc,然后将选项传递给 CocoaPods 下载器,它很可能使用 curl通过 CLI(不利的一面是,这会将任何请求降级为 HTTP/1.1)。
    猜你喜欢
    • 2019-04-21
    • 2017-12-08
    • 2018-09-11
    • 2019-03-31
    • 2021-12-18
    • 2011-09-12
    • 2016-09-10
    • 2015-02-09
    • 1970-01-01
    相关资源
    最近更新 更多