Si un de vos sites se trouve derrière un proxy (Nginx, HAProxy,…) vous risquez d’avoir quelques difficultés à configurer correctement votre wordpress. La documentation officielle (le codex) l’explique très rapidement.

L’objectif de ce tutoriel :

  • Avoir un site WordPress capable de répondre en HTTP & HTTPS
  • Forcer le back-office à ne répondre que en HTTPS
  • Enfin, migrer tout le site uniquement sur du HTTPS.

L’infra que j’utilise pour la démonstration est basée sur 4 containers docker:

  • Un container NGINX configuré en reverse-proxy.
  • Un container Apache / PHP 7.2 avec l’application wordpress.
  • Un container MySQL
  • Un Container Let’s Encrypt utilisé pour générer le certificat et le renouveler.

La partie let’s encrypt sera l’objet d’un autre tutoriel. Cette configuration n’entre pas dans le scope de ce tuto.

Quel est le problème de départ ?

Si l’ensemble de votre chaîne est en HTTPS,tout devrait bien se passer. Si ce n’est pas le cas, vous pouvez suivre tout de meme ce tuto, qui devrait vous donner des infos utiles.

Si comme moi, la partie SSL est gérée par un proxy, et que les applications derrière, fonctionnent en HTTP, vous aller rencontrer des problèmes. En effet, l’opération classique visant à indiquer à wordpress via son site URL et homepage URL que vous êtes sur du HTTPS, va avoir pour effet de générer une redirection infinie vers du HTTPS.

C’est logique, votre proxy va communiquer avec wordpress en HTTP. Si ce dernier est configuré pour etre en HTTPS, il va automatiquement (et bêtement), rediriger en HTTPS, ce que va faire le proxy, qui va re-transmettre la requête en HTTP à wordpress, qui va rediriger en HTTPS… et ça boucle… et ça boucle…

Etape 1 : Les headers de votre proxy

D’abord, vérifiez les headers de votre proxy afin de vérifier qu’ils transmettent les X-FORWARDED-FOR ou/et X-FORWARDED-HOST.

X-FORWARDED-FOR Donne l’ip du demandeur, et non celle du proxy qui fait suivre la requête.
X-FORWARDED-HOST Donne l’host du demandeur et non celui du proxy.

La présence d’un de ces deux headers, est, en général, le signe que votre application est derrière un proxy.

Exemple de configuration dans NGINX :

  location / {

    proxy_read_timeout    90;
    proxy_connect_timeout 90;
    proxy_redirect        off;

    proxy_set_header      X-Real-IP $remote_addr;
    proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header      X-Forwarded-Proto https;
    proxy_set_header      X-Forwarded-Port 443;
    proxy_set_header      Host $host;

    proxy_pass http://www.tellaw.org;

}

Etape 2 : Configurer votre wordpress

Ce point est assez simple, il suffit d’ajouter le bout de code suivant dans votre fichier de configuration wp-config.php.

Ce morceaux de code va identifier la présence des headers du proxy pour forcer la configuration en HTTPS.

if ( (!empty( $_SERVER['HTTP_X_FORWARDED_HOST'])) ||
    (!empty( $_SERVER['HTTP_X_FORWARDED_FOR'])) ||
    (!empty( $_SERVER['HTTP_X_FORWARDED_PROTO']) && strtoupper($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'HTTPS' ) ) {

    define('WP_HOME', 'https://www.tellaw.org');
    define('WP_SITEURL', 'https://www.tellaw.org');

    $_SERVER['HTTPS'] = 'on';
}

Etape 3 : Forcer l’admin en HTTPS

Enfin, pour forcer l’admin de wordpress en HTTPS, ajoutez la ligne suivante dans votre fichier de configuration wp-config.php

define('FORCE_SSL_ADMIN', true);

 

Etape 4 : Rediriger le traffic HTTP vers HTTPS

Si vous utilisez Nginx, le plus simple est d’ajouter la configuration suivante :

server {
  listen 80;
  server_name www.mydomain.org;

  location / {
    return 301 https://$host$request_uri;
  }
}

Le tuto pas à pas en vidéo ;