之前在某些文章中看到建议在nginx配置中用return401而不用403,也没说具体原因,最近这不闲了,突然想起来,google了半天也没有任何相关的信息(可能不太会用google),没办法,只能自己实践看看了


401 Unauthorized:该HTTP状态码表示认证错误,它是为了认证设计的,而不是为了授权设计的。收到401响应,表示请求没有被认证—压根没有认证或者认证不正确—但是请重新认证和重试。(一般在响应头部包含一个WWW-Authenticate来描述如何认证)。通常由web服务器返回,而不是web应用。从性质上来说是临时的东西。(服务器要求客户端重试)

403 Forbidden:该HTTP状态码是关于授权方面的。从性质上来说是永久的东西,和应用的业务逻辑相关联。它比401更具体,更实际。收到403响应表示服务器完成认证过程,但是客户端请求没有权限去访问要求的资源


上面是两个状态码的解释,总的来说,401响应应该用来表示缺失或错误的认证;403响应应该用来表示当用户被认证后,但用户没有被授权对特定资源的访问或操作,这不是今天的重点


既然是nginx中配置的,那就配置nginx,访问下。这里用的nginx1.17.7版本测试,编译--with-debug,开启了debug,先查看return 401,为了方便,配置好之后,清空了日志,浏览器访问之后

Nginx禁止访问该用401还是403_java

查看日志大小

Nginx禁止访问该用401还是403_java_02

查看host.access.log,正常的401请求日志

Nginx禁止访问该用401还是403_java_03

查看host.error.log,详细记录了从请求进入的整个处理过程

Nginx禁止访问该用401还是403_java_04

查看error.log,只有epoll的定时器

Nginx禁止访问该用401还是403_java_05


接着改成return 403

查看日志,大小差不多

查看host.access.log

正常的403日志返回,查看host.error.log,403请求详细记录

Nginx禁止访问该用401还是403_java_06

查看error.log,同样只有epoll的定时器

Nginx禁止访问该用401还是403_java_07


从上面的测试结果来看,401和403对于nginx来说,好像没什么不同,该处理的,还是要处理,没有少任何步骤,所以401和403的选择,应该是根据你要返回给客户端什么样的信息来决定


另外附HTTP状态码决策图,建议收藏!

Nginx禁止访问该用401还是403_java_08