欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
ngx_http_headers_module模块允许将"Expires"和"Cache-Control"头字段以及任意字段添加到响应头中。
响应头处理模块 语法及语义
add_header
语法:add_header name value [always];
语义:如果响应码等于200、201(1.3.10)、204、206、301、302、303、304、307(1.1.16、1.0.13)或308(1.13),则将制定字段添加到响应头中。参数值可以包含变量。
可以指定多个add_header指令,当且仅当add_header当前级别上未定义任何指令时,这些指令才从先前的配置级别继承。
如果指定了always(1.7.5),则无论响应码为何值,都将添加标头字段。
add_trailer
语法:add_trailer name value [always];
语义:如果响应码等于200、201、206、301、302、303、307或308,则将指定的字段添加到响应的末尾。参数值可以包含变量。
可以指定多个add_trailer指令,当且仅当add_trailer当前级别上未定义任何指令时,这些指令才从先前的配置级别继承。
如果指定了always,则无论响应码为何值,都将添加标头字段。
expires
语法:expires [modified] time;
语义:如果响应码等于200、201(1.3.10),204、206、301、302、303、304、307(1.1.16、1.0.13)或308(1.13.0),则启用或禁用添加或修改"Expires"和"Cache-Control"响应标头字段。该参数可以是正数或负数时间。
"Expires"头:告知浏览器资源有效性的截止日期,截止日期之内有效,截止日期之外需重新获取资源。
"Cache-Control"头:"Expires"头有一个非常大的缺陷,它使用一个固定的时间,要求服务器与客户端的时钟保持严格的同步,并且这一天到来后,服务器还得重新设定新的时间。
Http1.1引入了"Cache-Control",它使用max-age指定资源的有效时间,从请求开始在max-age时间内浏览器使用缓存,之外的使用请求,这样就可以消除"Expires"头的限制,如果对浏览器兼容性要求很高的话,可以两个都使用。
响应头处理模块 示例
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name securitit;
location / {
# 增加自定义响应头.
add_header Securitit-header yn;
# 增加自定义响应头.
add_trailer Securitit-trailer yn;
# 设置超时时间.
expires 1m;
root html;
index index.html;
}
}
}
通过浏览器访问http://192.168.20.9/index.html,查看响应头,可以看到修改的Expires以及自定义的Securitit-hreader头及内容。
总结
Http的头信息,在Http协议应用过程中是一个很重要的信息载体。服务器一般通过响应头信息来告知客户端应该具备或执行哪些行为。
Nginx作为反向代理,将原始服务器隐藏在其之后,其提供的响应头处理模块用处还是很大的:
· 客户端缓存:
包括expires、Cache-Control等响应头,可以告知客户端如何处理资源以及如何进行资源缓存。
· CORS跨域解决方案:
出于安全性的考虑,浏览器的同源策略不允许Ajax调用当前源以外的资源,但是随着微服务、前后端分离等开发和部署方式的出现,跨域俨然成为了必不可少的功能。
CORS的出现正是为了解决此类问题,需要服务器告知浏览器可跨域的设置:
Access-Control-Allow-Origin:要么请求时Origin字段的值,要么是一个*,表示接受指定域名的请求。
Access-Control-Allow-Methods:表明服务器支持跨域请求的方法,多个值以逗号分隔。
Access-Control-Request-Headers:表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段,多个值以逗号分隔。
Access-Control-Allow-Credentials:表示是否允许浏览器发送cookie, 需要在服务器配置。
Access-Control-Max-Age:"预检"请求的缓存时间。
Nginx作为反向代理服务器时,可以在反向代理中统一设置,避免进行后端应用或其集群的改造。
· P3P 头设置
在某些业务场景下,可能需要允许浏览器发送第三方Cookie,以便应用可以正常提供服务。例如传统Web软件开发过程中,可能经常性通过标签嵌套第三方网站,以达到系统集成的目的,此时若不设置P3P头的话,标签内嵌的系统可能会无法使用Cookie。
上面的情况,在应用开发时时无法预见的,可以使用Nginx进行P3P头设置,达到效果。
· 其他情况
作为反向代理,可以把它当做应用的一部分,进行流量接入,需要进行响应头操作的行为,都可以在Nginx中设置,但是一定要注意设置的权限范围,以避免有安全隐患的行为波及不相关业务。
若文中存在错误和不足,欢迎指正!