概括来说,Nginx会把带下划线的header认为无效,会过滤掉,如果不想被过滤掉,在http设置里加上这行underscores_in_headers on; 代码如下:
user nginx;
worker_processes 1;
http {
underscores_in_headers on;
...
下面是我碰到这个问题的经过:
当我把客户端(基于iview admin)和后台服务(基于grails)第一版基本完成后,我要部署到阿里云服务器。为了提高静态资源的访问效率,我决定把静态资源用nginx来处理,后台服务用tomcat来处理。当我部署完成后发现一个问题,登录成功后,获取用户信息的接口总是返回403错误。403错误有可能还是NGINX返回的,也可能还是tomcat返回的。我想到的一个方法是直接访问tomcat看看是否正常,因此来判断是NGINX配置的问题,还是别问题。
可是直接访问Tomcat的8080端口,没有反应。我想可能是防火墙的问题。就网上各种搜索,看看怎样把8080端口暴露给外网。可惜各种方法都不成功。后来我干脆把Nginx停掉,把Tomcat的端口改成80端口,可以访问了,接口也能正常调用了。那为啥通过nginx就总报403错误呢?我想应该是Nginx过滤掉了登录的凭证(token),token同通过header:access_token来传递的。后来把underscores_in_headers on;加上就好了。
从这个问题的解决,我也有个感悟,就是问题没有找到有效的解决方案时,不知道问题出在哪里,不知道需要多久能解决,心里没底。感觉这种心里没底的问题,最折磨人。系统环境、设置等问题往往具有这个特征。如果是代码的问题,心里往往不着急,解决需要的时间往往比较清楚。往大一点来说,人生很多问题都具有这个特征,如小学择校,高考填志愿,决定跟谁结婚,是否要辞职创业,等等问题或选择都类似,因为,没人能给你明确的答案。网上一搜,可能有无数的答案,但是,所有的答案需要自己去印证其有效性。