gameFu's Blog

nginx https http端口转发 和 cors

April 14, 2016

nginx https配置

https的使用需要申请证书,证书需要去专门的CA申请,但是个人网站建议使用免费证书,可以节省不少费用,国内的免费证书申请网站有https://www.wosign.com/。国外的免费证书申请网站有Let's Encrypt,但是Let's Encrypt的免费证书有效期只有90天,如果想长时间使用需要写定时脚本不断更新证书,具体操作可以看这篇博客.

nginx上配置https比较简单只需要拿到crt证书,和证书的私钥在nginx上几行代码就可配置了

listen 443;
ssl on;
ssl_certificate dsjstage.bao.tv_bundle.crt;
ssl_certificate_key dsjstage.bao.tv.key;

https 和 http的端口转发


return 301 https://$host$request_uri;

nginx cors 配置

js跨域问题是在实际开发中经常会遇到的情况,使用nginx解决跨越问题十分的方便。

nginx实现跨域的简单流程是对于简单请求,如GET,只需要在HTTP Response后添加Access-Control-Allow-Origin。
对于非简单请求,比如POST、PUT、DELETE等,浏览器会分两次应答。第一次preflight(method: OPTIONS),主要验证来源是否合法,并返回允许的Header等。第二次才是真正的HTTP应答。所以服务器必须处理OPTIONS应答。OPTIONS请求要做204处理。

接下来是各个参数

Access-Control-Allow-Origin(必含) – 允许的域名,只能填通配符或者单域名(尽量不要使用通配符)
Access-Control-Allow-Methods(必含) – 这允许跨域请求的http方法(常见有POST、GET、OPTIONS)
Access-Control-Allow-Headers(当预请求中包含Access-Control-Request-Headers时必须包含) – 这是对预请求当中Access-Control-Request-Headers的回复,和上面一样是以逗号分隔的列表,可以返回所有支持的头部。(设置时要注意查看http请求头的参数)
Access-Control-Allow-Credentials(可选) – 该项标志着请求当中是否包含cookies信息,只有一个可选值:true(必为小写)。如果不包含cookies,请略去该项,而不是填写false。这一项与XmlHttpRequest2对象当中的withCredentials属性应保持一致,即withCredentials为true时该项也为true;withCredentials为false时,省略该项不写。反之则导致请求失败。
Access-Control-Max-Age(可选) – 以秒为单位的缓存时间。预请求的的发送并非免费午餐,允许时应当尽可能缓存。


     add_header 'Access-Control-Allow-Origin' 'xxxx';
     add_header 'Access-Control-Allow-Credentials' 'true';
     add_header 'Access-Control-Allow-Methods' 'GET, POST, DELETE, PUT, OPTIONS';
     add_header 'Access-Control-Allow-Headers' 'Accept, Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     if ($request_method = 'OPTIONS') {
       add_header 'Access-Control-Allow-Origin' 'xxxx';
       add_header 'Access-Control-Max-Age' 1728000;
       add_header 'Access-Control-Allow-Credentials' 'true';
       add_header 'Access-Control-Allow-Methods' 'GET, POST, DELETE, PUT, OPTIONS';
       add_header 'Access-Control-Allow-Headers' 'Accept, Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
       add_header 'Content-Type' 'text/plain charset=UTF-8';
       add_header 'Content-Length' 0;
       return 204;
     }