在 Nginx 配置中设置 Custom Header 并将其传递给 gunicorn
Set Custom Header in Nginx config and pass it to 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 的条目。
这是打印 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'}
谁能告诉我我做错了什么。
主要问题是 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。
我正在尝试在 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 的条目。 这是打印 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'}
谁能告诉我我做错了什么。
主要问题是 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。