Apache-2.4

在 Apache 中為每個瀏覽器使用不同的 HTTP 協議

  • December 6, 2018

我正在嘗試將 http/2 用於除 Safari 之外的所有內容,因為我們在將 http/2 與我們方便的任何版本的 Safari 一起使用時會看到一些奇怪的行為。但是,我無法弄清楚如何設置 Apache 以允許它。任何人都可以闡明為什麼以下不起作用?

BrowserMatchNoCase Safari NOHTTP2
# Chrome includes both Safari and Mozilla in its User Agent
BrowserMatchNoCase Chrome !NOHTTP2

<IfDefine NOHTTP2>
   Protocols http/1.1
</IfDefine>
<IfDefine !NOHTTP2>
   Protocols h2 h2c http/1.1
</IfDefine>

目前在/etc/apache2/mods-enabled/http2.conf. 我沒有使用IfDefineor的經驗BrowserMatch,所以我不確定我是否正確地執行了此操作(鑑於它不起作用,看來我不是)。我測試的每個瀏覽器仍然啟用了上述配置的 http/2 以及我測試過的任何其他瀏覽器。

我也嘗試過SetEnvIfNoCase User-Agent代替,以及除andBrowserMatch以外的各種選項,但是在執行 configtest 時,所有這些都會引發“此處不允許使用協議”錯誤。IfDefine``If``Directory

我在 Debian 9.6 上執行 Apache 2.4.25。

我懷疑你不能做你想做的事,因為當你弄清楚客戶端正在使用什麼瀏覽器時,你已經協商了協議並收到了請求;User-Agent 作為請求標頭送出。

只有當您將二進製文件作為額外參數傳遞時,您的第一個<IfDefine>塊才會起作用,這會將所有客戶端的協議限制為 HTTP/1.1。因為未設置定義,所以預設為啟用所有協議的第二個塊。見https://httpd.apache.org/docs/2.4/mod/core.html#ifdefinehttpd``-DNOHTTP2

引用自:https://serverfault.com/questions/943173