我正在托管Cloudflare代理后面的网站,这意味着我的服务器的所有请求都通过端口80,即使Cloudflare处理HTTP(端口80)和HTTPS(端口443)流量。
为了区分这两者,Cloudflare包含一个X-Forwarded-Proto
标题,根据用户的连接设置为“http”或“https”。
我想将带有X-Forwarded-Proto: http
标头的每个请求重定向到我的网站的SSL版本。如何使用nginx配置实现这一目标?
答案 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;
}
}
这段代码是抽象的,但你可以试试......