Nginx配置http请求重定向到https、Nginx防止被域名恶意解析的配置-Nginx 的 default_server 指令

一、nginx 配置 http 请求重定向到 https

  server段{}可以这样写:

// 方式1
rewrite ^/(.*)$ http://domain.com/$1 permanent;

// 方式2
rewrite ^ http://domain.com$request_uri? permanent;

// 方式3
rewrite ^(.*)$ https://${server_name}$1 permanent; 

  nginx新版本可以换个写法,如下:

server {
  listen      80;
  server_name wan.bo.com;
  return      301 https://$server_name$request_uri;
}

server {
  listen       443 ssl;
  server_name  wan.bo.com;

  ssl on;
  ssl_certificate      /etc/nginx/cert/web.jisuoffice.com.crt;
  ssl_certificate_key  /etc/nginx/cert/web.jisuoffice.com.key;
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ·····
}

  我采用的配置如下写:

server {
    listen      80;
    server_name aaa.abc.dd;
    rewrite     ^(.*)$ https://${server_name}$1 permanent;
}

  这样就可以 http://aaa.abc.dd 转到 https://aaa.abc.dd 了。

二、Nginx防止被域名恶意解析的配置

  先说结论,我们的配置:

server {
    listen      80 default_server;
    server_name _;
    return      444;
}

  再说为什么要加这个配置呢?网上查的问题如下:

今天太倒霉了,发现通过IP无法访问服务器的80端口很无语,昨天都还好的啊,也没有修改过配置,其他端口又是正常的,防火墙也没问题。于是问了下机房,给了个崩溃的回复说我们的服务器有个域名没有备案被电信多次通告,然后就把我们ip端口给封了。。。。封了啊。。。疯了,关键是这个域名TMD不是我的啊

经过一番折腾,发现是 nginx 配置上貌似有个漏洞,导致任何域名解析到服务器都能被正常请求,虽然是个空白页,但HTTP状态码是200。

主要是缺少下面的配置代码:

server {
    listen       80  default_server;
    server_name  _;
    access_log   off;
    return       444;
}

这样在浏览器端访问的时候,浏览器会自动提示用户无法访问。

三、Nginx 的 default_server 指令

server {
    listen       80  default_server;
    server_name  oschina.net  www.oschina.net;
    ...
}

  先看上面这段配置,listen 指令后面有一个参数 default_server ,这个参数是在 0.8.21 版本以后才有的,而之前是 default 指令。

  Nginx 的虚拟主机是通过HTTP请求中的Host值来找到对应的虚拟主机配置,如果找不到呢?那 Nginx 就会将请求送到指定了 default_server 的 节点来处理,如果没有指定为 default_server 的话,就跑到 localhost 的节点,如果没有 localhost 的节点,那只好 404 了。

  另外你也可以指定对于没有匹配的 Host 值时,返回错误到客户端,这在现在国内用来处理未备案域名指向自己时非常有用,看看下面的配置:

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

  通过返回444这个Nginx的非标准错误码来让Nginx断开与浏览器之间的连接。

Nginx配置http请求重定向到https、Nginx防止被域名恶意解析的配置-Nginx 的 default_server 指令

上一篇:在论坛中出现的比较难的sql问题:22(触发器专题3)


下一篇:phpmyadmin连接,管理多个mysql服务器