web-dev-qa-db-fra.com

Comment résoudre WordPress HTTPS problèmes derrière un Amazon Load Balancer?

J'ai déjà eu ce problème. Lors de l'exécution de WordPress (ou d'autres scripts PHP) derrière Amazon EC2 Load Balancer, les scripts ne réalisent pas qu'ils sont exécutés sur le protocole https: // et entraîne des problèmes tels que des boucles de redirection sans fin et des avertissements HTTPS ("Certains contenus de cette page sont demandés de manière non sécurisée ...").

J'ai trouvé une solution ici, mais nécessite de modifier WordPress core, ce qui n'est pas bon pour la mise à jour: https://wordpress.org/support/topic/when-behind-Amazon- web-services-elastic-load-balancer-causes-endless-redirect

Existe-t-il un moyen de résoudre ce problème sans modifier WordPress core? J'utilise Apache 2.2.

45
A.B. Carroll

Comme le lien que vous avez suggéré, pour WordPress le problème réside dans la fonction is_ssl(), qui comme la plupart des logiciels PHP vérifie explicitement le $_SERVER['HTTPS'] et $_SERVER['SERVER_PORT'] pour vérifier si la page actuelle est en cours d'accès dans le contexte https: //.

Lorsque votre page est accessible via HTTPS, mais qu'Amazon Load Balancer effectue un déchargement SSL et demande réellement votre contenu sur le port non SSL 80, le serveur Web, PHP ou toute autre chose d'ailleurs, ne comprend pas ou ne voit pas qu'il est accessible via https: //.

Le correctif est que l'ELB d'Amazon envoie la norme de facto X-Forwareded-Proto En-tête HTTP, que nous pouvons utiliser pour déterminer quel protocole le client utilise en fait de l'autre côté de l'équilibreur de charge.

Avec Apache 2.2, vous pourriez utiliser quelque chose comme:

<IfModule mod_setenvif.c>
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>

Cela lit simplement le X-Forwared-Proto en-tête, et s'il est égal à https, définissez la variable d'environnement HTTPS sur 1. PHP verra cette variable d'environnement, et finalement elle deviendra $_SERVER['HTTPS'] ce qui équivaut à 1 - comme pour une "vraie" requête SSL native.

62
A.B. Carroll

Une autre option de la documentation WordPress est d'ajouter ceci à votre wp-config.php:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';
24
zeroimpl

Si quelqu'un d'autre recherchait l'équivalent Nginx, voici ce que vous devez faire:

Pour la configuration de la réécriture, vous devez ajouter ce qui suit sous le bloc server:

if ($http_x_forwarded_proto != 'https') {
    rewrite ^ https://$Host$request_uri? permanent;
}

Et pour définir le paramètre HTTPS, vous devez ajouter ce qui suit sous le location ~ \.php$ bloc:

if ($http_x_forwarded_proto = 'https') {
    set $fe_https 'on';
}
fastcgi_param HTTPS $fe_https;

N'oubliez pas de supprimer tout autre fastcgi_param HTTPS commande si vous en avez (je l'avais dans mon fastcgi_params fichier).

10
Gal Talmor

Utilisez cette méthode en 4 étapes pour supprimer la boucle de redirection et les problèmes de contenu mixte lors de l'utilisation de SSL dans WordPress.

1) Remplacez 'http: //' par '//' dans la base de données - Cela crée toutes les URL relatives pour les images et autres actifs

2) dans wp-config, définissez les variables génériques wp_home et wp_siteurl.

define('WP_HOME','//'. $_SERVER['SERVER_NAME']);
define('WP_SITEURL','//'. $_SERVER['SERVER_NAME']);

3) Si vous utilisez un équilibreur de charge, utilisez la variable serveur 'HTTP_X_FORWARDED_PROTO' pour comprendre le protocole utilisé. Pour ce faire, ajoutez cette ligne dans wp-config

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';

4) Enfin dans .htaccess, utilisez cette ligne si vous êtes derrière loadbalancer pour rediriger tout le trafic vers https.

 # http to https
 RewriteCond %{HTTP:X-Forwarded-Proto} =http
 RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
6
Ankit Anand

Aucun des problèmes ci-dessus n'a résolu les erreurs de contenu mixte pour moi malheureusement. Cependant, ce qui a fonctionné, c'était l'ajout du protocole aux variables WP_HOME && WP_SITEURL dans wp-config.php, par ex.

define( 'WP_HOME', 'https://' . $_SERVER['HTTP_Host']); define( 'WP_SITEURL', WP_HOME );

Après cela, toutes les URL de la source ont commencé par https et toutes les erreurs de contenu mixte ont disparu.

4
Mike