如何使nginxredirect基于头的值?

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

为了区分两者,Cloudflare包含一个基于用户连接设置为“http”或“https”的X-Forwarded-Proto头。

我想用X-Forwarded-Proto: http头将每个请求redirect到我的网站的SSL版本。 我怎样才能实现这个与Nginx的configuration?

最简单的方法是使用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... } 

尝试使用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; } } 

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