X-Frame-Options 响应头
X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, </iframe> 或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。
X-Frame-Options:值有三个
(1)DENY:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
(2)SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。
(3)ALLOW-FROM https://example.com/:表示该页面可以在指定来源的 frame 中展示。
nginx 配置
可以在https server location 配置
location / { root /data/nginx/example-app; index index.html; add_header X-Frame-Options SAMEORIGIN; }
验证(浏览器登录访问)
proxy_read_timeout
应用场景
通过nginx 代理上传文件给后端服务,由于文件太大上传时间较长,后端服务日志显示超时,原因就是nginx 等待超时所以断开了。
配置
location /pay-api { ... ... proxy_read_timeout 120s;
说明
该指令设置与代理服务器的读超时时间默认60s。它决定了nginx会等待多长时间来获得请求的响应。这个时间不是获得整个response的时间,而是两次reading操作的时间。
client_max_body_size
应用场景
通过nginx 代理服务器,上传大文件被限制,通过更改此参数调整允许上传文件大小。
配置
location /pay-api {
... ...
client_max_body_size 100m; #调整为100M
说明
如果后端是Php 服务,文件上传大小限制得瓶颈也可能在php 端,两端都有解除限制。
根据客户端类型返回相应地址
应用场景
如果网站的后端架构PC 与移动端是分离的,也就是分别部署的,那么当PC浏览器访问的是移动端的网站地址时,那么就会根据其客户端类型判断进而返回一个PC端的URL。
server { listen 80; server_name m.kzf.com; if ($http_user_agent ~* (Windows|Macintosh)) { return http://www.kzf.com; } }
default server 配置
显示配置
vi defaul.conf
server { listen 80 default_server; server_name _; root /opt/nginx/html;
}
default_server 的作用就是当请求过来后根据域名找不到相应的server name 就会匹配此处的规则。
隐式配置
defaul server 分为两种上面的为显示配置,还有一种是隐式配置,所谓隐式配置就是没有确切的配置,就会默认加载的第一个配置文件里面的第一个server 配置为default server。
应用场景
一般正常提供访问的地址都是定义server name 为域名,为了禁止ip 访问就会通过default server 匹配到ip 访问的请求,然后此类访问返回403 禁止IP 访问。
加载顺序
nginx 批量载入配置 conf.d/*conf 时会按 ascii 排序载入,这就会以 server_a.conf server_b.conf server_c.conf 的顺序载入,如果没有生命 default_server 的话,那 server_a 会作为默认的 server。另外如果主配置文件中有server 配置,因为朱配置文件最先加载所以此处的server作为default_server的优先级是最大的。
referer指令实现防盗链配置
有一些后端服务以接口的形式通过前端页面来访问的,也就是说前端页面里面嵌套的后端的访问地址,为了安全后端接口只允许前端页面里面访问请求后端接口,而不允许其他未知网站跳转到后端。可以通过nginx 配置
server { listen 80; server_name www.asdf.com; location /api { valid_referers none blocked server_names www.qq.com; #none blocked 等这些条件是或的关系,就是满足一 if ($invalid_referer) { return 403; } proxy_pass http://backend.service.com; } }
valid_referers 指令详解
该指令后面可以接 none blocked serevr_names string或者是正则表达式
none 代表没有referer ,如果直接访问后端接口 http://backend.service.com/api 那么请求头里面是没有referer 字段的,也就是none ,也就是根据实际情况决定是否允许直接访问接口进而决定是否配置none。
blocked 代表有referer但是被防火墙或者是代理给去除了
string或者正在表达式 用来匹配referer
nginx会通过查看referer字段和valid_referers后面的referer列表进行匹配,如果匹配到了就invalid_referer字段值为0 否则设置该值为1
通过curl 测试验证配置是否生效
curl http://www.asdf.com/api -H 'Referer:http://www.qq.com' 正常转发到后端
curl http://www.asdf.com/api refere不存在,也就是None ,如果配置了none 就会正常转发到后端
curl http://www.asdf.com/api -H 'Referer:http://www.baidu.com' 返回403
注意返回301 重定向情况:
当location 后面配置路径有/ 时候,但是用户请求的url 后面没有/ 那么请求到达nginx 后就会重定向,添加缺失的/ 。
示例如下:
location /api/ { proxy_pass http://backend.service.com; }
curl http://www.asdf.com/api #请求的url 中未带/ ,返回代码301 ,避免这种情况就需要加上/ 或者location 中的路径去掉/。
rewrite 指令的相对路径和绝对路径区别
当nginx 前面还有一层slb 做转发的时候,并且slb监听端口与nginx 监听端口不一致的时候,rewrite 指令的使用相对路径与绝对路径就有很大不同。
前提条件:url 为 http://asdf-kzf.com 经过slb 的80 转发到了nginx 的4438 端口
相对路径配置
server { listen 4438; server_name xxx; location / { rewrite ^/$ /test permanent; } }
此配置浏览器显示转发的路径重定向为http://asdf-kzf.com:4438/test ,但是此请求到了slb 无法识别此端口,所以请求有问题。
绝对路径配置
server { listen 4438; server_name xxx; location / { rewrite ^/$ https://asdf-kzf.com/test permanent; } }
次请求
http://asdf-kzf.com/test 由于是绝对路径转发所以没有nginx 端口,所以相当于重新发起了请求到slb ,所以此配置是对的
总结:当nginx 前面没有代理,或者其代理与它本身端口是相同的,此时可以使用相对路径进行rewrite ,否则使用绝对路径。