web-dev-qa-db-fra.com

Drupal derrière un proxy inverse de déchargement SSL - cette configuration est-elle correcte?

Nous effectuons la transition d'une installation drupal existante pour fonctionner en tant que site SSL uniquement derrière un proxy de déchargement SSL. Drupal lui-même n'a pas de SSL et fonctionne sur le port 80) sur Apache.

Nous avons ce que nous pensons être une configuration assez réussie:

Au bout du monde, il ressemble à:

server {
    listen              80;
    server_name         staging.example.com;
    return              301 https://staging.example.com$request_uri;
}

server {
    listen                  443 ssl;
    server_name             staging.example.com;
    ssl_certificate         $chained_cert_path
    ssl_certificate_key     $private_key_path;

    location / {
        proxy_pass          http://$backend_ip;
        proxy_set_header    Host $Host;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    X-Forwarded-By $server_addr:$server_port;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_redirect      http:// https://;
    }
}

Et dans la configuration du site drupal nous exécutons:

// reverse proxy settings and such
$conf['reverse_proxy'] = TRUE;
$conf['reverse_proxy_addresses'] = array($proxy_ip);
$base_url = 'https://staging.example.com';

Comme je l'ai dit, cela semble passer tous les tests, mais mon sens ambide dit que c'était trop facile et qu'il y a un problème énorme qui attend quelque part dans une partie de drupal nous ne comprenons pas assez bien - le pavage manuel de $ base_url ne me convient pas. Y a-t-il des mines terrestres ici?

6
Wyatt Barnett

Vous n'êtes pas obligé d'indiquer $base_url = 'https://staging.example.com';, vous pouvez avoir quelque chose comme ceci:

server {
    listen              80;
    server_name         staging.example.com;
    return              301 https://$Host$request_uri;
}

server {
    listen                  443 ssl;
    server_name             staging.example.com;
    ssl_certificate         $chained_cert_path
    ssl_certificate_key     $private_key_path;

    location / {
        proxy_pass          http://$backend_ip;
        proxy_set_header    Host $Host;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    X-Real-IP $remote_addr;
    }
}

et dans vos paramètres Drupal:

$conf['reverse_proxy'] = TRUE;
$conf['reverse_proxy_addresses'] = array($proxy_ip);

// from http://devblog.more-onion.com/using-drupal-behind-reverse-proxy
if (
  isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
  $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' &&
  !empty($conf['reverse_proxy']) &&
  in_array($_SERVER['REMOTE_ADDR'], $conf['reverse_proxy_addresses'])
) {
  $_SERVER['HTTPS'] = 'on';
  // This is hardcoded because there is no header specifying the original port.
  $_SERVER['SERVER_PORT'] = 443;
}
5
Céline Aussourd