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;
View Code

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 server

listen 80; proxy_intercept_errors on; charset utf-8; server_name chain-front-tst.xxx.com; client_max_body_size 200m; set $accessip false; if ( $http_x_forwarded_for ~ 124.127.104.130,.* ) {set $accessip true;} #rmkj-youxian if ( $http_x_forwarded_for ~ 124.127.104.130 ) {set $accessip true;} #rmkj-youxian if ( $http_x_forwarded_for ~ 180.212.253.41,.* ) {set $accessip true;} if ( $http_x_forwarded_for ~ 180.212.253.41 ) {set $accessip true;} if ( $http_x_forwarded_for ~ 10.50.8.32,.* ) {set $accessip true;} #vpn if ( $http_x_forwarded_for ~ 10.50.8.32 ) {set $accessip true;} #vpn if ( $accessip = 'false') {return 403;} if ($http_referer ~ "baidu.com") { rewrite ^/(.*)$ https://chain.peopletech.cn/ permanent; location ~ .*\.(css|js|swf)$ { add_header Cache-Control max-age=200; if_modified_since off; expires off; etag off; root /h5; location / { add_header Cache-Control private; add_header Cache-Control "no-store"; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if_modified_since off; expires off; etag off; root /h5; index index.html; try_files $uri $uri/ /index.html; location /api/v2/ { proxy_pass http://nft-api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location /media/uploads/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *; add_header Access-Control-Allow-Headers *; root /; #image_filter_buffer 200M; #image_filter_interlace on; #image_filter_jpeg_quality 80; #image_filter resize 100 80; location /api/v3/ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #注意添加theone3 白名单 proxy_pass https://theone3-appapi.peopletech.cn; #proxy_pass http://qa-theone3appapi.peopletech.cn; location /api/v3/certificate/c750X1805 { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://nft-compose-api; location /MP_verify_pvvGnSyTQDwEiXuP.txt { root /etc/nginx/; location /MP_verify_zaOvZJ2n3WL4t8Dd.txt { root /etc/nginx/; location /MP_verify_5QHNYaCMHnTn7UNv.txt { root /etc/nginx/;