426 Upgrade Required
Utilisation
Lorsque le code de statut 426 Upgrade Required est reçu, la réponse comporte un champ d’en-tête de réponse Upgrade indiquant le ou les protocoles requis.
Ce message est lié au message 101 Switching Protocols, envoyé en réponse à une demande de mise à niveau de protocole émise par le client au moyen de l’en-tête Upgrade.
Impact SEO
Les moteurs de recherche comme Google n’indexent pas une URL dont la réponse a le statut 426. Les URL précédemment indexées qui renvoient ce code de statut sont retirées des résultats de recherche.
Exemple
Le client demande une ressource en HTTP en clair et le serveur répond 426 Upgrade Required parce que TLS est obligatoire. Le client bascule vers HTTPS et la requête aboutit.
HTTP/2 et HTTP/3
HTTP/2 et HTTP/3 se négocient par ALPN pendant la poignée de main TLS, et non par l’en-tête Upgrade. Le mécanisme de mise à niveau HTTP/2 en clair (h2c) a été retiré de la spécification. L’en-tête Upgrade s’applique aux changements de protocole tels que TLS et WebSocket.
Requête initiale
GET /tech-news HTTP/1.1
Host: example.com
Réponse initiale
HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.2
Connection: upgrade
Content-Type: text/html
Content-Length: 140
<html>
<head>
<title>TLS Required</title>
</head>
<body>
<p>This service requires TLS.</p>
</body>
</html>
Requête suivante en HTTPS
GET /tech-news HTTP/1.1
Host: example.com
Réponse
HTTP/1.1 200 OK
Content-Type: text/html
Comment corriger
Lisez l’en-tête Upgrade de la réponse pour identifier le protocole requis. Le serveur y liste un ou plusieurs protocoles acceptables tels que TLS/1.2, HTTP/2, HTTP/3 ou websocket.
Pour une mise à niveau de version de protocole, faites basculer le client vers le protocole indiqué et renvoyez la requête. HTTP/2 et HTTP/3 utilisent ALPN pendant la poignée de main TLS plutôt que l’en-tête Upgrade. Pour d’autres protocoles comme WebSocket, incluez Connection: upgrade et l’en-tête Upgrade correspondant. Le serveur répond 101 Switching Protocols et la connexion se poursuit sous le nouveau protocole.
Pour les connexions WebSocket passant par nginx, configurez le proxy afin qu’il transmette les en-têtes upgrade :
Sans ces directives, nginx utilise HTTP/1.0 par défaut pour les connexions amont et supprime les en-têtes upgrade, ce qui produit un 426 à chaque tentative de poignée de main WebSocket.
Lorsqu’un serveur impose HTTPS, remplacez le schéma de l’URL de la requête, http://, par https://. Vérifiez que TLS 1.2 ou TLS 1.3 est activé dans le client ou dans l’environnement d’exécution. Les versions TLS plus anciennes sont généralement rejetées.
Mettez à jour les bibliothèques clientes et les SDK lorsqu’ils ne prennent pas en charge le protocole requis. Les bibliothèques HTTP obsolètes utilisent HTTP/1.1 par défaut et n’ont aucune capacité de négociation HTTP/2 ou HTTP/3.
Supprimez les en-têtes Upgrade superflus des requêtes qui ne visent pas un changement de protocole. Certains proxys interprètent un en-tête Upgrade parasite comme une tentative de négociation de protocole et renvoient 426.
Références de code
.NET
HttpStatusCode.UpgradeRequired
Rust
http::StatusCode::UPGRADE_REQUIRED
Rails
:upgrade_required
Go
http.StatusUpgradeRequired
Symfony
Response::HTTP_UPGRADE_REQUIRED
Python3.5+
http.HTTPStatus.UPGRADE_REQUIRED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_UPGRADE_REQUIRED
Angular
@angular/common/http/HttpStatusCode.UpgradeRequired