如何根据标头的值进行nginx重定向?

时间:2014-10-06 19:48:20

标签: nginx cloudflare

我正在托管Cloudflare代理后面的网站,这意味着我的服务器的所有请求都通过端口80,即使Cloudflare处理HTTP(端口80)和HTTPS(端口443)流量。

为了区分这两者,Cloudflare包含一个X-Forwarded-Proto标题,根据用户的连接设置为“http”或“https”。

我想将带有X-Forwarded-Proto: http标头的每个请求重定向到我的网站的SSL版本。如何使用nginx配置实现这一目标?

2 个答案:

答案 0 :(得分:38)

最简单的方法是使用if指令。如果有更好的方法,请告诉我,因为人们说if指令效率低下。 Nginx会在标题中将破折号转换为下划线,因此X-Forwarded-Proto变为$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... 
}

答案 1 :(得分:3)

尝试使用map指令:http://nginx.org/en/docs/http/ngx_http_map_module.html#map

像这样......

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;
    }
}

这段代码是抽象的,但你可以试试......