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

Kev*_*rke 29 nginx cloudflare

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

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

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

Kev*_*rke 43

最简单的方法是使用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... 
}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小注意事项:如果您有多个server_name值,最好将返回字符串替换为更通用的版本:return 301 https:// $ host $ request_uri; (9认同)
  • 不确定你跟谁说话,但是效率不高.当在重写领域之外的目的被滥用时,它容易出错.正确阅读if是邪恶的文章,了解它的缺点.您的解决方案就是它的设计目标,因此它应该可以正常工作. (2认同)
  • 在这种情况下,如果不是邪恶的:“在位置上下文中,如果在内部可以完成的唯一 100% 安全的事情是:返回并重写” https://www.nginx.com/resources/wiki/start/topics/depth /如果邪恶/ (2认同)

小智 9

尝试使用地图指令: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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码是抽象的,但你可以尝试这种方式......