我已经将 nginx 设置为在 Heroku 上运行的 django 站点的 gunicorn 反向代理。我将 Anymail 用于我的邮件列表,它需要接收 webhook 的基本身份验证凭据(我实际上不需要设置基本身份验证,我只需要传递带有凭据的标头)。
但我似乎无法将凭据传递给服务器。
奇怪的是,这是有效的,我可以访问HTTP_AUTHORIZATION
Django 中的标头,其值为“test”,正如预期的那样:
proxy_set_header Authorization "test";
但这不起作用,HTTP_AUTHORIZATION
Django 没有找到任何标头:
proxy_set_header Authorization $http_authorization;
这是我的nginx.conf.erb
:
daemon off;
#Heroku dynos have at least 4 cores.
worker_processes <%= ENV['NGINX_WORKERS'] || 4 %>;
events {
use epoll;
accept_mutex on;
worker_connections 1024;
}
http {
server_tokens off;
include mime.types;
default_type application/octet-stream;
#Must read the body in 5 seconds.
client_body_timeout 5;
upstream app_server {
server unix:/tmp/nginx.socket fail_timeout=0;
}
server {
listen <%= ENV["PORT"] %>;
server_name example.com "";
keepalive_timeout 5;
location / {
proxy_set_header Host $host;
proxy_pass http://app_server;
}
location /authtest {
proxy_set_header Host $host;
proxy_pass http://app_server;
# this doesn't work - no HTTP_AUTHORIZATION header found by Django
#proxy_set_header Authorization $http_authorization;
# this does work and returns the value "test" for the HTTP_AUTHORIZATION header
proxy_set_header Authorization "test";
# tested enabling and disabling these, they don't appear to make a difference
#proxy_pass_header Authorization;
#proxy_set_header X-Forwarded-User $remote_user;
}
}
}
答案1
好的,我发现了问题——我已经在 Chrome 和 Firefox 上通过在 URL 栏中输入内容进行了测试。foo:[email protected]/authtest
事实证明,最近这些浏览器已经开始悄悄地删除凭据,除非页面上确实设置了基本身份验证。由于我只想将凭据传递给 Django,页面上没有基本身份验证,因此它们被删除了。
测试https://httpstatus.io/并明确设置标题,并且凭据被正确传递。