nginx泛域名http(80)强制跳转https(443)
随着chrome浏览器在地址栏开始标注网站『不安全』的提示开始,各大小网站都开始从http转为https了,并且都更注重网站的安全了。然页我们之前的很多站点都是基于http开发的,如果全部改造成https,必然是很大的工作量,幸好有第三方的工具可以为我们解决这个问题,可以让原有的系统不改动的情况下,或者少改动的情况下就能够满足这个需求。nginx就是其中使用最为广泛的一个,并且它的响应最快,目前国内绝大多数平台或者系统在前端都使用的是nginx或者nginx的变种。
为每个域名(子域名)申请证书,然后配置nginx,这样就可以解决https证书问题。但为每个域名或者子域名都申请一个证书,暂起不说费用问题,申请也是比较麻烦的事,所以申请一个支持泛域名的能用证书是最方便的,所有子域名都可以使用该证书,肯定是最快捷的。
业务需求:
通过NGINX方向代理实现转发,并要求不论http或https.最终实现https方式访问网站.
单域名的:
upstream drift {
server IP:prot
}
server {
listen 80;
server_name drift.hk;
server_name www.drift.hk;
rewrite ^ https://www.drift.hk$request_uri? permanent;
}
server {
listen 443 ssl;
server_name www.drift.hk;
location = /favicon.ico {
return 404;
}
charset utf-8;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://drift;
}
ssl_certificate /root/project/ssl/drift.crt;
ssl_certificate_key /root/project/ssl/drift.key;
ssl_session_timeout 5m;
access_log /var/log/nginx/wwwhk_access.log;
error_log /var/log/nginx/wwwhk_error.log;
}
以上这种方式,只能实现单域名的转发,而不能实现泛域名的转发
泛域名转发:
upstream drift {
server IP:prot;
server IP:prot;
}
server {
listen 80;
server_name *.drift.hk;
return 301 https://$http_host$request_uri;
}
server {
listen 443 ssl;
server_name *.drift.hk;
gzip on;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml; #
gzip_vary on;
gzip_disable “MSIE [1-6].”;
location = /favicon.ico {
return 404;
}
charset utf-8;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://starwthk;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
ssl_certificate /root/project/ssl/drift_hk.crt;
ssl_certificate_key /root/project/ssl/drift.hk.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
access_log /var/log/nginx/all_bosshk_access.log;
error_log /var/log/nginx/all_bosshk_error.log;
}
这里的server_name均指定的为 *.drift.hk ,
重点就在于 [ return 301 https://http_host$request_uri ] 这一句。
在这里不得不提一下不管是使用server_name,都不能让浏览器正常跳转到相应的子域名,
只有使用$http_host这样才可以.
通过以上配置,80端口被强制跳转到了443,但443中通过 proxy_pass http://drift/;
实际还是跳转回了http的原始端口,但对外,浏览器和用户所看到的确实是https了,并且显示的是安全网站。
重要的概念:
$host 包含”按此优先顺序:来自请求行的主机名,或来自主机,请求行字段的主机名,或与请求匹配的服务器名称”.
$http_host 包含HTTP “host” 头字段的内容(如果它存在请求中).
$server_name 包含处理请求的的虚拟主机的server_name,因为它在NGINX配置中定义的,如果服务器包含多个server_name,则此变量中只存在第一个server_name.
$request_uri 这个变量等于从客户端发送来的原生请求URI,包括参数。它不可以进行修改。
url这个变量指当前的请求URI,不包括任何参数(见url 这个变量指当前的请求URI,不包括任何参数(见url这个变量指当前的请求URI,不包括任何参数(见args)。这个变量反映任何内部重定向或index模块所做的修改。注意,这和requesturi不同,因request_uri不同,因request
u
ri不同,因request_uri是浏览器发起的不做任何修改的原生URI。不包括协议及主机名。
rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url.
由于用户代理在请求行而不是在Host:头部发送的主机名是合法的 ,尽管除了连接到代理之外很少进行,但是你必须考虑到这一点.