• 前提
  • 遇到的问题
  • 分析解决
  • Nginx设置日志


前提

我用nginx代理了两个端口,如下图所示:

nginx拦截无效路径 nginx拦截所有请求_linux

项目使用了一个拦截器,除了首页和静态资源都会被拦截

nginx拦截无效路径 nginx拦截所有请求_Nginx_02

遇到的问题

如下图所示:我登录进入了首页,然后点击显示页面,但是被拦截了,显示页面就是一个list请求,按理说在Session存在的情况下不可能被拦截呀。

nginx拦截无效路径 nginx拦截所有请求_ico_03


nginx拦截无效路径 nginx拦截所有请求_ico_04

分析解决

我想是不是Session失效了或者访问的不是同一个端口,因为上面设置了nginx代理是轮询权重都是1,也就是说第一次访问8081,第二次就访问8082,但是我也设置了ip_hash(点击查看详细解释),它的作用就是让同一个ip地址一直访问同一个服务器的同个端口号,于是我打开nginx的日志查看。

日志如下:(Nginx如何设置日志以及格式,文章的最下面我会写)

nginx拦截无效路径 nginx拦截所有请求_nginx_05


上面不知道为什么会访问 .map后缀的静态文件(点击了解这个文件),它在第一个端口没找到自然就去第二个端口查找但是依旧没找到报错404,但是我项目中没有用过这种文件,于是百度一查了解到这是,.js/.css等静态文件自带的,浏览器会自动访问如果没有访问到就会报错404。解决办法:如下图这个js文件,打开后直接拉到最后一行,将这行代码删除,浏览器就不会访问这个.map文件了,其他静态文件依旧如此。

nginx拦截无效路径 nginx拦截所有请求_Nginx_06


你以为这样就解决了吗,不!依然是被拦截,所以继续看日志看看哪里还有问题。静态资源已经不会访问.map文件了,但是依旧会有/favicon.ico这个请求,我查了一下,一般浏览器在每一个页面都会自动发送/favicon.ico请求,众所周知我是除了静态资源和首页都被拦截了,/favicon.ico也不例外。

nginx拦截无效路径 nginx拦截所有请求_nginx拦截无效路径_07


解决办法:

写个接口,并在拦截器中放过此请求即可。

nginx拦截无效路径 nginx拦截所有请求_Nginx_08


nginx拦截无效路径 nginx拦截所有请求_ico_09

Nginx设置日志

第一步、打开Nginx的主配置文件:nginx.conf,我们在http下设置 log_format 就是日志格式

像$request_method这种就是nginx自带的格式代表请求的方式(GET、POST)。
但是像$year-$month-$day $hour:$minutes:$seconds是我们自定义的,需要在每个server下配置

      #配置日志时间的格式
      if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
			set $year $1;
			set $month $2;
			set $day $3;
			set $hour $4;
			set $minutes $5;
			set $seconds $6;
		}

nginx拦截无效路径 nginx拦截所有请求_nginx_10


这是我的格式

log_format main '$year-$month-$day $hour:$minutes:$seconds $request_method "$request_uri" $http_host  $status $request_time $remote_addr|$http_referer $http_user_agent 访问的真实后台:$upstream_addr\n'

nginx默认的格式:

#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

第二步、打开自己需要代理的server

箭头处就是日志文件存放地址,一定要加上main,代表引用主配置文件中的格式。

nginx拦截无效路径 nginx拦截所有请求_nginx_11