web-dev-qa-db-fra.com

Comment faire une redirection nginx basée sur la valeur d'un en-tête?

J'héberge un site Web derrière un proxy Cloudflare, ce qui signifie que toutes les demandes à mon serveur sont sur le port 80, même si Cloudflare gère le trafic HTTP (port 80) et HTTPS (port 443).

Pour distinguer les deux, Cloudflare inclut un X-Forwarded-Proto en-tête défini sur "http" ou "https" en fonction de la connexion de l'utilisateur.

Je souhaite rediriger chaque demande avec un X-Forwarded-Proto: http en-tête vers la version SSL de mon site. Comment puis-je y parvenir avec une configuration nginx?

28
Kevin Burke

La façon la plus simple de le faire est d'utiliser une directive if. S'il existe un meilleur moyen, faites-le moi savoir, car les gens disent que la directive if est inefficace. Nginx convertit les tirets en traits de soulignement dans les en-têtes, donc X-Forwarded-Proto devient $http_x_forwarded_proto.

server {
    listen 80;
    server_name example.com; # Replace this with your own hostname
    if ($http_x_forwarded_proto = "http") {
        return 301 https://example.com$request_uri;
    }

    # Rest of configuration goes here... 
}
42
Kevin Burke

Essayez d'utiliser la directive map: http://nginx.org/en/docs/http/ngx_http_map_module.html#map

Quelque chose comme ca...

map $http_x_forwarded_proto     $php_backend {
    "https"          "https_php_backend named loc";
    default        "default_php_backend named loc";
}
server{
    location / {
         proxy_pass http://$php_backend;
    }
}

Ce code est abstrait, mais vous pouvez essayer de cette façon ...

4
user989840