angie icon indicating copy to clipboard operation
angie copied to clipboard

Support for populating $http_host with the :authority header in HTTP/3 (QUIC)

Open MarcoMarcoaldi opened this issue 1 year ago • 1 comments

Description

I would like to report a technical issue regarding the use of HTTP/3 (also known as QUIC) with all versions of ANGIE. The problem involves the $http_host variable, which remains empty in HTTP/3 because it is not populated using the values from the :authority header. This behavior differs from HTTP/1 and HTTP/2, where $http_host is correctly populated using client-provided data.

Technical Configuration

In my case, I am using ANGIE for a Magento 2 installation that hosts three multilingual sites. The configuration uses a map directive to determine the language code of the site (e.g., Italian, English, or German) based on the value of $http_host. Below is a simplified example of the configuration:

map $http_host $MAGE_RUN_CODE {
    www.bselfie.it website_it;
    www.bselfie.it/en website_en;
    www.bselfie.de website_de;
}

This configuration works perfectly with HTTP/2: the $http_host value is correctly passed and allows the appropriate site or language to be served. However, with HTTP/3, $http_host remains empty because this protocol uses the :authority header, which does not automatically populate $http_host.

The Problem

In HTTP/3, the lack of a value for $http_host causes routing logic to fail. For instance:

Requests to www.bselfie.it/en are not correctly mapped because $http_host is empty. Magento cannot identify the specific site and always defaults to the primary site (Italian in this case). This behavior makes it impossible to use HTTP/3 alongside configurations that rely on $http_host unless HTTP/3 support is completely disabled, which is not an ideal solution.

Technical Considerations

While the $host variable could be considered an alternative, it is not suitable in this scenario. $host only contains the main domain (www.bselfie.it) and does not include critical parts of the URL, such as /en, which are necessary for differentiating configurations. Therefore, $host cannot replace $http_host for setups that depend on advanced routing logic or mapping.

Proposal

I propose that ANGIE be updated to support the automatic population of $http_host in HTTP/3 by retrieving values from the :authority header, as is done for HTTP/1 and HTTP/2. This improvement would ensure consistent behavior across HTTP protocol versions and resolve issues like the one described.

Conclusion

I believe this functionality is crucial for improving the adoption and compatibility of HTTP/3 in complex scenarios. I am available to provide further details or examples if needed.

Thank you, Marco Marcoaldi MANAGED SERVER SRL

MarcoMarcoaldi avatar Jan 23 '25 10:01 MarcoMarcoaldi

The "Host" header cannot contain URL. There are something wrong with your configuration and assumptions in general. It won't work regardless of $http_host presence even with HTTP/1.x and HTTP/2.

In general you should use $host as it contains safe and normalized value. In order to match URL, you should use the $uri variable.

VBart avatar Jan 24 '25 00:01 VBart

Implemented by https://github.com/webserver-llc/angie/commit/140c3a6deb71512a4aafd2ab6334af54d6787957 and will be released with Angie 1.11.

VBart avatar Sep 29 '25 16:09 VBart