nginx泛域名http(80)强制跳转https(443)

落花浮王杯 提交于 2019-12-11 03:16:46

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://httphosthttp_hostrequest_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,包括参数。它不可以进行修改。
urlURI(url 这个变量指当前的请求URI,不包括任何参数(见args)。这个变量反映任何内部重定向或index模块所做的修改。注意,这和requesturirequest_uri不同,因request_uri是浏览器发起的不做任何修改的原生URI。不包括协议及主机名。
rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url.

由于用户代理在请求行而不是在Host:头部发送的主机名是合法的 ,尽管除了连接到代理之外很少进行,但是你必须考虑到这一点.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!