nginx+apache2+python+wsgi请求头中Authorization信息丢失

在开发公司CMDB过程当中,前端使用augular4,后端使用django+restframework。前端

前端angular代码打包直接经过nginx静态资源访问的方式提供服务,后端api经过apache2的wsgi方式启动,经过nginx代理解决跨域向前端提供服务。python

在本机开发的时候就很简单,nginx同时转发angular启动的web服务,django启动的api服务,api访问也很正常。nginx

搭建集成测试环境时,后端使用virtualenv打包,经过apache2 conf启动,相关配置以下:web

nginx:apache

root /usr/share/cmdb/web

location /api {
                proxy_pass http://127.0.0.1:8000;
        }
location /docs {
                proxy_pass http://127.0.0.1:8000;
        }

location /static {
                proxy_pass http://127.0.0.1:8000;
        }

apache2django

<VirtualHost *:8000>
    WSGIScriptAlias / /usr/share/cmdb/venv/cmdb-api/cmdb/wsgi.py
    WSGIDaemonProcess cmdb python-path=/usr/share/cmdb/venv/lib/python2.7/site-packages
    WSGIProcessGroup cmdb
    WSGIApplicationGroup %{GLOBAL}
    Alias /static/ /usr/share/cmdb/venv/lib/python2.7/site-packages/rest_framework/static/
    <Directory /usr/share/cmdb/venv/lib/python2.7/site-packages/rest_framework/static/>
        Require all granted
    </Directory>
</VirtualHost>

api调用是须要登陆后在header中加入Authorization,但搭建好的测试环境除了登陆api能调用外,其他的api所有报401,提示信息为"invalid token header"。后端

经过print打印发现传入的Authorization值为空。api

开始怀疑nginx没有将Authorization头转发,经过postman直接请求api,报相同的问题。跨域

排除nginx问题,又怀疑是virtualenv依赖不全致使的,而后停掉apache2,激活virtualenv时经过python manager.py runserver调用api,发现没有问题。python2.7

最终剩下apache2的问题,这时候看了openstack keystone的配置,发现有个WSGIPassAuthorization On,看着很像。

在conf中加上此配置,Authorization请求头顺利转发。api调用正常。

最终的apache配置以下

<VirtualHost *:8000>
    WSGIScriptAlias / /usr/share/cmdb/venv/cmdb-api/cmdb/wsgi.py
    WSGIDaemonProcess cmdb python-path=/usr/share/cmdb/venv/lib/python2.7/site-packages
    WSGIProcessGroup cmdb
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    Alias /static/ /usr/share/cmdb/venv/lib/python2.7/site-packages/rest_framework/static/
    <Directory /usr/share/cmdb/venv/lib/python2.7/site-packages/rest_framework/static/>
        Require all granted
    </Directory>
</VirtualHost>
相关文章
相关标签/搜索