2016-03-07 45 views
1

我試圖在nginx中設置一個自定義標題,並最終將它傳遞給運行django應用程序的gunicorn服務器。 更改nginx配置文件後,我檢查了django中的request.META字典,但我的自定義標題丟失。我相信nginx沒有正確發送頭文件。這是我的相關nginx配置文件內容。在Nginx配置文件中設置自定義標題並將其傳遞給gunicorn

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標頭的條目。 這是印刷request.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'} 

任何人都可以給我建議我在做什麼錯在這裏。

回答

2

主要問題是proxy_set_header指令在if塊中不允許。

但是,使用map指令可以實現相同的功能。使用http塊內的以下內容:

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

而在你現有的位置塊以下幾點:

proxy_set_header renderMobileWebsite $render_mobile_rewrite; 

詳見this document

+0

嘿理查德,非常感謝。剛剛檢查,這似乎是工作。我不知道在block中使用指令是有限制的。 – Anurag

相關問題