django - 在 Nginx 配置中设置自定义 header 并将其传递给 gunicorn

标签 django nginx http-headers gunicorn

我正在尝试在 nginx 中设置自定义 header ,并最终将其传递给运行 django 应用程序的 gunicorn 服务器。 更改 nginx 配置文件后,我检查了 django 中的 request.META 字典,但我的自定义 header 丢失了。我相信 nginx 没有正确发送 header 。这是我相关的nginx配置文件内容。

server {
   listen 443;
   server_name www.example.com;
   client_max_body_size 40M;
   ssl on;
   ssl_certificate /home/ubuntu/prodStuff/ssl/server.crt;
   ssl_certificate_key /home/ubuntu/prodStuff/ssl/server.key;

   ssl_session_timeout 5m;
   ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
   ssl_prefer_server_ciphers on;

    access_log /home/ubuntu/logs/nginx-access.log;
    error_log /home/ubuntu/logs/nginx-error.log info;
    set $mobile_rewrite perform;
     location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            if ($mobile_rewrite = perform) {
              proxy_set_header renderMobileWebsite "1";
            }
            else{
              proxy_set_header renderMobileWebsite "0";
            }
            proxy_pass_header renderMobileWebsite;
            if (!-f $request_filename) {
            proxy_pass http://djangoapp_server;
            break;
            }
    }

然后我只是打印 request.META 但没有 renderMobileWebsite header 条目。 这是打印请求的输出。META

{'HTTP_COOKIE': '_gat=1; csrftoken=mGKNffeg7DjwvAsulLigzYwzni5eu; 
_ga=GA1.2.1693535173.1467728753; 
sessionid=ye46dsu9ff68jktbdfhdrhhdielu2np2e0g; 
wcsid=61ln3H0NVEu1RDhf285Ly32sDJ04QKE2; 
hblid=wVO8zgtwCPYjhGjb285Ly32sDJ4EQK0a; 
_oklv=1457358771468%2C61ln3H0NVEu1RDhf285Ly32sDJ04QKE2; 
_ceg.s=o3o983; _ceg.u=o3o983', 'SERVER_SOFTWARE': 'gunicorn/19.2.1', 
'SCRIPT_NAME': u'', 'REQUEST_METHOD': 'POST', 'PATH_INFO': u'/product/updateSwatch/', 
'HTTP_ORIGIN': 'https://www.example.com', 
'SERVER_PROTOCOL': 'HTTP/1.0', 
'QUERY_STRING': '', 
'CONTENT_LENGTH': '107', 
'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36', 
'HTTP_CONNECTION': 'close', 'HTTP_REFERER': 'https://www.example.com/catalogue/hazel/', 
'SERVER_NAME': '127.0.0.1', 
'REMOTE_ADDR': '127.0.0.1', 
'wsgi.url_scheme': 'https', 
'SERVER_PORT': '8000', 
'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest', 
'HTTP_X_FORWARDED_PROTO': 'https', 
'REMOTE_PORT': '45389', 
'wsgi.input': <gunicorn.http.body.Body object at 0x7fc0117d87d0>, 
'HTTP_HOST': 'www.example.com', 
'wsgi.multithread': False, 
'HTTP_ACCEPT': '*/*', 'wsgi.version': (1, 0), 
'RAW_URI': '/product/updateSwatch/', 
'wsgi.run_once': False, 'wsgi.errors': <gunicorn.http.wsgi.WSGIErrorsWrapper object at 0x7fc0117d8450>, 
'wsgi.multiprocess': True, 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8', 
'gunicorn.socket': <socket._socketobject object at 0x7fc011855e50>, 
'HTTP_X_FORWARDED_PORT': '443', 
'CONTENT_TYPE': 'application/x-www-form-urlencoded; charset=UTF-8', 
'HTTP_X_FORWARDED_FOR': '115.118.144.31, 172.31.17.146', 
'wsgi.file_wrapper': <class 'gunicorn.http.wsgi.FileWrapper'>, 
'HTTP_ACCEPT_ENCODING': 'gzip, deflate'}

任何人都可以告诉我我在这里做错了什么。

最佳答案

主要问题是 proxy_set_header 指令在 if block 中是不允许的。

但是,使用 map 指令可以实现相同的功能。在 http block 中使用以下内容:

map $mobile_rewrite $render_mobile_rewrite {
    default     0;
    perform     1;
}

以及您现有位置 block 中的以下内容:

proxy_set_header renderMobileWebsite $render_mobile_rewrite;

参见 this document了解详情。

关于django - 在 Nginx 配置中设置自定义 header 并将其传递给 gunicorn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35845155/

相关文章:

ios - NSURLResponse 没有名为 allHeaderFields 的成员

python - Ansible Django 模块替代 Python 解释器

Django REST Framework : when to create a hyperlinked resource and when nested resource? 如何发布嵌套资源?

Django - 基于URL的静态内容显示

java - 状态码 404,ai.api.AIServiceException : Uri is not found or some resource with provided id is not found

angular - 预检响应中的 Access-Control-Allow-Headers 不允许请求 header 字段 Access-Control-Allow-Methods

django - 从另一个应用程序加载自定义标签过滤器

Node.js 发送带有数据的 post 请求?

MongoDB半夜关闭,无法恢复

asp.net - fastcgi-mono-server4在nginx上调试,可能吗?