2015-02-26 80 views
4

今天我聽說很快就會在現代瀏覽器中實現http2協議。更多信息:https://en.wikipedia.org/wiki/HTTP/2,我知道維基百科不是最好的資源,但它會給出一些關於正在發生的事情的線索。問題是:HTTP2頭與舊版瀏覽器的兼容性


舊瀏覽器如何響應http2頭?

我的意思是在PHP(http://php.net)仍有(2015年2月26日)一在頭函數(http://php.net/manual/en/function.header.php)鏈接到http1.1規範(http://www.faqs.org/rfcs/rfc2616)。據我所知,在http2我所要做的就是將標題從HTTP/1.1 404 Not Found更改爲類似於HTTP/2.0 404 Not Found的東西。但是舊版瀏覽器會如何迴應?這對webdeveloper和php編碼器是透明的,並且在瀏覽器/服務器端實現,或者有一些關於兼容性的重要事情/線索?

正確使用http2頭後,他們準備好了嗎?

我不想傷害任何人,但我知道這樣,它名字的福斯產品I啓動瀏覽器,和第二字母E,可總是亂了一點。恐怕新的規範將徹底毀掉這個瀏覽器的所有舊版本,並且這個http2。而且,我們 - 開發人員必須編寫正常工作的網站,無論在哪裏,並且在老式機器數以千萬計的補丁/升級/幾個月的兼容性問題後,神奇的http2將會實現。


必須有很好的問題形成了一些代碼,所以這裏是:):

<?php 
    header("HTTP/2.0 404 Not Found"); // Am I correct? It will look like this? 
?> 

什麼舊的瀏覽器在這種情況下?

這是一個好主意,在http2活着之後使用它吧?


附加文檔:http2

  1. 草案規範:https://tools.ietf.org/html/draft-ietf-httpbis-http2-17
  2. 維基百科幾句:https://en.wikipedia.org/wiki/HTTP/2
  3. PHP頭功能:http://php.net/manual/en/function.header.php
  4. W3.org約http2:http://www.w3.org/Protocols/HTTP/HTTP2.html
+0

PS。我的問題的第二部分是基於一點點意見,但我希望有一個答案,這就是我問它的原因。我的意思是,如果有很大的優點或缺點,請寫出來,如果這取決於,第二部分並不重要。我不想在這裏進行討論,但請檢查http2官方批准後是否可以正確使用。 –

+1

http2.0是基於二進制的,懷疑它會和以前一樣 – Carey

回答

10

在典型的情況下,支持HTTP/2的客戶端聯繫服務器時首先使用HTTP/1.1連接,使用Upgrade:標頭指示HTTP/2支持的可用性。

這看起來是這樣的:

GET/HTTP/1.1 
Host: server.example.com 
Connection: Upgrade, HTTP2-Settings 
Upgrade: h2c 
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload> 

來源:HTTP/2 draft 17, Sec 3.2

我引用的規格,直接出現,所以從真正的客戶真正的要求會稍微複雜一點的期待 - 這將包括通常的HTTP/1.1頭也是如此,以至於不希望升級到HTTP/2的服務器可以簡單地繼續這個請求。不支持HTTP/2的服務器只會忽略Upgrade: h2cHTTP2-Settings: ...標頭。

服務器升級連接到HTTP與/ 2響應:

HTTP/1.1 101 Switching Protocols 
Connection: Upgrade 
Upgrade: h2c 
  
PRI * HTTP/2.0 
  
SM 
  
  

來源:HTTP/2草案17,二段3.2

也就是說部開始PRI *被稱爲 '客戶端連接前言' 和是在任何HTTP/2連接開始時發送。它被設計成一個沒有HTTP/1.0或/1.1服務器響應的字符串。這意味着,即使在瀏覽器有理由相信服務器在連接前支持HTTP/2的非典型場景(例如,我們正在討論可能是通過其他協議進行服務廣告的Intranet環境)時,HTTP/2客戶端將打開與「PRI * HTTP/2.0 \ r \ n \ r \ nSM \ r \ n \ r \ n」的連接,並立即被任何HTTP/1以HTTP/1.1 400錯誤請求拒絕。 X服務器。 (例如,客戶端可能會將請求降級到HTTP/1.1並繼續,例如)。

重寫PHP應用程序以直接使用HTTP/2比改變header('HTTP/X.X...')號碼要花費更多的工作量。 Saikyr是對的,HTTP/2是二進制協議;這意味着我們將使用一個新的庫直接從PHP編寫HTTP/2。

發送狀態碼和消息以及協議版本不再發生。相反,使用僞頭文件 - 基本上只是在前面加上a:的頭部以確保不與HTTP/1.X頭部發生衝突。然而,頭文件不會以明文方式發送 - 已經制定了將頭文件轉換爲二進制代碼的壓縮方案。 HPACK draft 12.(我還沒有看過,這是少了翻頁式比HTTP/2)。

所以不是header("HTTP/2 404 Not Found");你會做這樣的事情:

\HTTP2::setHeader(':status','404'); 

或代替header("Location: $PROTO://$HOST$PATH");

\HTTP2::setHeader('location', "$PROTO://$HOST$PATH"); 

我還沒有意識到這種支持在PHP中,所以我猜那裏有一點。我不確定PHP是否可以獲得足夠的Apache連接控制權來從HTTP/2升級並管理連接本身。隨着向Apache添加支持,PHP可能有機會在圖書館級別進行鏈接。無論新的庫如何,它可能仍然能夠編寫HTTP/1.1連接的頭文件,具體取決於客戶端 - 但它需要重寫軟件,除非他們決定重新解析每個HTTP/2參數輸出(這不是不可思議的,但在我看來,它會導致比解決更多的問題)。

可以添加HTTP/2支持的一種方法是在服務器/傳輸級別,並將HTTP/1.1標頭翻譯成HTTP/2。Apache模塊可以設想解析HTML輸出並檢測鏈接的樣式表,腳本和圖像,並在響應GET請求時向客戶端生成PUSH_PROMISE。

直接在PHP中支持HTTP/2的主要優點是可以將鏈接的資源「推送」給支持該功能的願意客戶端。許多基於PHP的CMS環境將能夠提供樣式表,腳本和圖像列表,而不必重新解析用於客戶端的輸出。

我期待着看到我們能做的事!附件1:

+0

我現在接受你的回答。我很確定沒有人會發布更好的答案:)。另外從我+1。感謝您的時間,以及豐富的資源。我完全印象深刻。我保證我會按照你的個人資料和+1每個「如此專業」的答案:)。 –

+1

謝謝!我一直在享受閱讀規範,所以我很樂意分享我的想法。你的問題真的很合時宜。 –