如何修復“跨主機名並行下載”問題

錯誤型別:
HTTP錯誤
錯誤名稱:
跨主机名并行下载
英文名稱:
parallelize downloads across hostnames
錯誤描述:
这原则上不是一个错误,而是使用旧的HTTP协议,肯能存在跨域并行下载影响网站加载速度的问题。服务器采用HTTP/2以上协议是不存在该问题的。

如何修復“跨主機名並行下載”問題

如果在您的網站上發現潛在的連線問題,大多數網站速度測試工具都會顯示“跨主機名並行下載”警告。雖然在大多數情況下它很容易修復,但在某些情況下您可以簡單地忽略它。

在本文中,我們將瞭解導致“跨主機名並行下載”警告的原因以及如何解決此問題。

是什麼導致“跨主機名並行下載”問題出現?

“跨主機名並行下載(parallelize downloads across hostnames)”錯誤通常出現在有大量請求的網站上。這是如何發生的:

HTTP 1.x協議決定單使用者客戶端最多可以與任何伺服器建立兩個連線。這意味著如果佇列中有太多資源需要載入,它可能會產生積壓。

另一方面,大多數瀏覽器也有一些限制——每個域最多六個連線。如果您開啟的選項卡太多,您將很容易達到此限制。

在大多數情況下,人們會嘗試重新連線,或者嘗試提供多個子域來避免限制(我們稍後會談到)。

然而,這種情況只發生在HTTP 1.x連線上。

如果您使用HTTP/2和安全連線,這將不再是問題。HTTP/2是修訂版,允許並行下載。當然現在大部分主機服務商,都使用HTTP/2而不是HTTP 1.x。

話雖如此,當您在HTTP/2連線上時,忽略“跨主機名並行下載”警告是安全的。

某些工具(如GTMetrixPingdom)可能仍會出現此錯誤——使用不同的名稱——無論這對您來說是否是一個實際問題。

修復“跨主機名並行下載”錯誤

如前所述,為了避免限制,人們試圖使用子域來管理資產,以欺騙瀏覽器並允許更多的並行連線。這種做法稱為域名分片(domain sharding)

域名分片是一種使用多個子域增加同時下載資源數量的方法。因此,您可以使用域分片來修復“跨主機名並行下載”錯誤。

請記住,域名分片也會留下負面影響,例如:

  • DNS查詢時間增加
  • 快取功能丟失
  • 移動裝置瀏覽器的潛在問題

基本上,域名分片有兩個步驟——設定子域和編輯function.php檔案。

設定子域

域名分片的第一步是建立多個子域或CNAME記錄。但是,這可能會拆分對您的靜態內容的請求。

為此,您可以轉到您的域名管理面板,然後選擇類別下的子域。(注:不同域名服務商,可能稍有不同)

子域名管理

在空白欄位中輸入子域名,然後單擊建立。您可以重複此步驟以建立多個條目。大多數時候,新增三個子域就足夠了。

建立子域名 子域名目錄

設定子域後,您就可以編輯functions.php檔案了。

編輯主題functions.php檔案

域名分片的第二步是編輯主題function.php檔案以並行化主機名。

您可以轉到WordPress儀表盤 -> 外觀 -> 主題編輯器,然後選擇主題函式 (functions.php)

接下來,將以下程式碼新增到functions.php檔案中:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function parallelize_hostnames($url, $id) {
$hostname = par_get_hostname($url); //call supplemental function
$url = str_replace(parse_url(get_bloginfo('url'), PHP_URL_HOST), $hostname, $url);
return $url;
}
function par_get_hostname($name) {
$subdomains = array('media1.mydomain.com','media2.mydomain.com'); //add your subdomains here, as many as you want.
$host = abs(crc32(basename($name)) % count($subdomains));
$hostname = $subdomains[$host];
return $hostname;
}
add_filter('wp_get_attachment_url', 'parallelize_hostnames', 10, 2);
function parallelize_hostnames($url, $id) { $hostname = par_get_hostname($url); //call supplemental function $url = str_replace(parse_url(get_bloginfo('url'), PHP_URL_HOST), $hostname, $url); return $url; } function par_get_hostname($name) { $subdomains = array('media1.mydomain.com','media2.mydomain.com'); //add your subdomains here, as many as you want. $host = abs(crc32(basename($name)) % count($subdomains)); $hostname = $subdomains[$host]; return $hostname; } add_filter('wp_get_attachment_url', 'parallelize_hostnames', 10, 2);
function parallelize_hostnames($url, $id) {
$hostname = par_get_hostname($url); //call supplemental function
$url =  str_replace(parse_url(get_bloginfo('url'), PHP_URL_HOST), $hostname, $url);
return $url;
}
function par_get_hostname($name) {
$subdomains = array('media1.mydomain.com','media2.mydomain.com'); //add your subdomains here, as many as you want.
$host = abs(crc32(basename($name)) % count($subdomains));
$hostname = $subdomains[$host];
return $hostname;
}
add_filter('wp_get_attachment_url', 'parallelize_hostnames', 10, 2);

請注意,您需要使用您建立的子域更改$subdomains值。此外,請確保所有子域都具有相同的路徑以避免任何錯誤。

完成後,單擊更新檔案。就是這樣!

您還可以對CDN提供商(如 KeyCDN)執行相同的步驟來修復“跨主機名並行下載”錯誤。但是,由於大多數CDN提供商使用HTTP/2,因此不建議使用域名分片。

小結

如果您在測試網站時遇到“跨主機名並行下載”警告,請不要驚慌。它是由於瀏覽器和HTTP 1.x連線的限制而發生的。

總之,您可以通過兩個步驟使用域名分片方法修復錯誤:

  1. 設定子域
  2. 編輯functions.php檔案

但是,如果您的託管服務提供商已經使用HTTP/2,您可以放心地忽略此錯誤。

評論留言