一、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断开与浏览器之间的连接。