{"id":1971,"date":"2023-01-21T14:30:29","date_gmt":"2023-01-21T14:30:29","guid":{"rendered":"https:\/\/c.ipcpu.com\/?p=1971"},"modified":"2023-07-31T14:33:55","modified_gmt":"2023-07-31T14:33:55","slug":"nginx-underscores-headers","status":"publish","type":"post","link":"https:\/\/c.ipcpu.com\/2023\/01\/nginx-underscores-headers\/","title":{"rendered":"\u5173\u4e8enginx\u4e2d\u7684underscores_in_headers\u53c2\u6570"},"content":{"rendered":"

\u6982\u8ff0<\/h2>\n

Nginx\u7684\u914d\u7f6e\u4e2d\u6709\u4e00\u4e2a\u53c2\u6570\uff1aunderscores_in_headers\uff0c\u8fd9\u4e2a\u53c2\u6570\u9ed8\u8ba4\u503c\u4e3a\uff1aoff\uff0c\u610f\u601d\u662f\u9ed8\u8ba4\u5ffd\u7565\u540d\u79f0\u5e26\u4e0b\u5212\u7ebf\u7684 HTTP Header\u5934\u90e8\u4fe1\u606f\uff0c\u4e5f\u5c31\u662f\u8bf4\u5e26\u4e0b\u5212\u7ebf\u7684 HTTP Header\u4f1a\u88abNginx\u76f4\u63a5\u5ffd\u7565\uff0c\u4e0d\u4f1a\u5411\u540e\u7aefupstream\u8f6c\u53d1\u3002<\/p>\n

\u6b63\u5e38\u60c5\u51b5\u4e0b\u6211\u4eec\u7684HTTP Header\u5934\u90e8\u4fe1\u606f\u662f\u8fd9\u6837\u7684\uff1a
\n\"\"<\/a><\/p>\n

\u8fd9\u91cc\u9762\u662f\u4e0d\u4f1a\u51fa\u73b0\u5e26\u4e0b\u5212\u7ebf\u7684HTTP Header\u7684\uff0c\u9664\u975e\u5f00\u53d1\u4eba\u5458\u81ea\u5b9a\u4e49\u3002\u6240\u4ee5Nginx\u5b98\u65b9\u9ed8\u8ba4\u662f\u5173\u95ed\u7684\u3002
\n\u4f46\u662f\u603b\u4f1a\u6709\u4e9b\u5f00\u53d1\u4eba\u5458\u4e0d\u5c0f\u5fc3\u4f7f\u7528\u4e86\u5e26\u4e0b\u5212\u7ebf\u7684HTTP Header\uff0c\u5c31\u4f1a\u78b0\u89e6\u8fd9\u4e2a\u5751\u3002
\n\u4e3a\u4e86\u7ed5\u5f00\u8fd9\u4e2a\u5751\uff0c\u6211\u4eec\u505a\u5982\u4e0b\u7684\u5b9e\u9a8c\u6765\u9a8c\u8bc1\u3002<\/p>\n

\u9a8c\u8bc1<\/h2>\n

\u6211\u4eec\u4f7f\u7528Python(Flask)\u5199\u4e86\u4e00\u4e2a\u5c0fweb\u7a0b\u5e8f\uff0cFlask\u4ee3\u7801\u5982\u4e0b<\/p>\n

from flask import Flask, request, json\n\napp = Flask(__name__)\n\n@app.route('\/post', methods=['POST'])\ndef register():\n    print('===request header: ')\n    print(request.headers)\n    if  'application\/json' in request.headers['Content-Type']:\n        print('===recevied Content-Type: application\/json')\n        print(request.json)\n    else:\n        print('===stream read')\n        print(request.stream.read())\n        print(request.data)\n    return 'OK'\n\nif __name__ == '__main__':\n    app.run(host="0.0.0.0", port=15000, debug=True)<\/code><\/pre>\n

\u7136\u540e\u6211\u4eec\u4f7f\u7528PostMan\u5411Flask\u768415000\u7aef\u53e3\u53d1\u8bf7\u6c42\uff0cHTTP Header\u5934\u5982\u4e0b
\n
\"\"<\/a><\/p>\n

\u8f93\u51fa\u5982\u4e0b<\/p>\n

===request header:\nX-Real-Ip: 202.102.134.68\nMy-Oc2: sbac_6\nMyoc1: v_34\nContent-Type: application\/json\nUser-Agent: PostmanRuntime\/7.28.4\nAccept: *\/*\nPostman-Token: 1e092bc1-075e-42f6-8d28-ff94bf95885a\nHost: 10.140.100.22:16000\nAccept-Encoding: gzip, deflate, br\nConnection: keep-alive\nContent-Length: 28\n\n===recevied Content-Type: application\/json\n{'name': 'abc', 'value': 14}<\/code><\/pre>\n

\u6211\u4eec\u53ef\u4ee5\u770b\u5230 X_REAL_IP \u88ab\u8f6c\u6362\u6210X-Real-Ip\uff0c \u5185\u5bb9\u503c\u6ca1\u6709\u53d8\u5316\uff1bMy_OC2\u88ab\u8f6c\u6362\u6210My-Oc2\uff0c\u5185\u5bb9\u503c\u4e5f\u6ca1\u6709\u53d8\u5316\uff1bMyOC1\u88ab\u8f6c\u6362\u6210Myoc1\uff0c\u5185\u5bb9\u503c\u6ca1\u6709\u53d8\u5316\u3002<\/p>\n

\u7136\u540e\u6211\u4eec\u5957\u4e0anginx\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0d\u5f00\u542funderscores_in_headers\uff0c\u5f97\u5230\u5982\u4e0b\u7ed3\u679c\uff1a<\/p>\n

===request header:\nHost: 10.140.100.22\nX-Forwarded-For: 10.255.204.21\nConnection: close\nContent-Length: 28\nMyoc1: v_34\nContent-Type: application\/json\nUser-Agent: PostmanRuntime\/7.28.4\nAccept: *\/*\nPostman-Token: c5cc127c-203b-4500-aeb6-3cada9b484df\nAccept-Encoding: gzip, deflate, br<\/code><\/pre>\n

\u6211\u4eec\u53d1\u73b0X_REAL_IP \u3001My_OC2 \u8fd9\u4e24\u4e2aHeader\u76f4\u63a5\u88abnginx\u5220\u6389\u4e86\uff0cMyOC1\u4f20\u9012\u5230Flask\u88ab\u8f6c\u6362\u6210Myoc1\uff0c\u5185\u5bb9\u503c\u6ca1\u6709\u53d8\u5316\u3002<\/p>\n

\u6211\u4eec\u6253\u5f00nginx\u4e2dunderscores_in_headers\u7684\u5f00\u5173\uff0c\u8bbe\u7f6e\u4e3aon\uff0c\u7ed3\u679c\u5982\u4e0b\uff1a<\/p>\n

===request header:\nHost: 10.140.100.22\nX-Forwarded-For: 10.255.204.21\nConnection: close\nContent-Length: 28\nX-Real-Ip: 202.102.134.68\nMy-Oc2: sbac_6\nMyoc1: Vv_34\nContent-Type: application\/json\nUser-Agent: PostmanRuntime\/7.28.4\nAccept: *\/*\nPostman-Token: 729b414b-e4fb-46a7-88ed-ebf3825e2761\nAccept-Encoding: gzip, deflate, br<\/code><\/pre>\n

\u6211\u4eec\u770b\u5230\u8fd9\u4e9b\u5b57\u6bb5\u53c8\u51fa\u73b0\u4e86\u3002<\/p>\n

\u7ed3\u8bba<\/h2>\n

\u9ed8\u8ba4\u60c5\u51b5\u4e0bunderscores_in_headers\u662f\u5173\u95ed\u7684\uff0cnginx\u4f1a\u81ea\u52a8\u5220\u9664HTTP Header\u5934\u90e8\u5b57\u6bb5\u4e2d\u540d\u79f0\u5e26\u4e0b\u5212\u7ebf\u7684\u5b57\u6bb5\u3002\u5b57\u6bb5\u5185\u5bb9\u503c\u51fa\u73b0\u4e0b\u5212\u7ebf\u4e0d\u53d7\u5f71\u54cd\u3002
\nHTTP Header\u5934\u90e8\u7684\u7ed3\u6784\u4e3a \uff08Name\uff1aValue\uff09\uff0c\u53ea\u6709\u5f53Name\u5305\u542b\u4e0b\u5212\u7ebf\u624d\u4f1a\u5220\u9664\uff0cValue\u4e2d\u5305\u542b\u4e0b\u5212\u7ebf\u4e0d\u4f1a\u5220\u9664\u3002<\/p>\n

\u8d44\u6599<\/h2>\n

http:\/\/nginx.org\/en\/docs\/http\/ngx_http_core_module.html#underscores_in_headers<\/a><\/p>\n

\u8f6c\u8f7d\u8bf7\u6ce8\u660e\uff1aIPCPU-\u7f51\u7edc\u4e4b\u8def<\/a> » \u5173\u4e8enginx\u4e2d\u7684underscores_in_headers\u53c2\u6570<\/a><\/p>","protected":false},"excerpt":{"rendered":"

\u6982\u8ff0 Nginx\u7684\u914d\u7f6e\u4e2d\u6709\u4e00\u4e2a\u53c2\u6570\uff1aunderscores_in_headers\uff0c\u8fd9\u4e2a\u53c2\u6570\u9ed8\u8ba4\u503c\u4e3a\uff1aoff\uff0c\u610f\u601d\u662f\u9ed8\u8ba4\u5ffd\u7565\u540d\u79f0\u5e26\u4e0b\u5212\u7ebf\u7684 HTTP Header\u5934\u90e8\u4fe1\u606f\uff0c\u4e5f\u5c31\u662f\u8bf4\u5e26\u4e0b\u5212\u7ebf\u7684 HTTP Header\u4f1a\u88abNginx\u76f4\u63a5\u5ffd\u7565\uff0c\u4e0d\u4f1a\u5411\u540e\u7aefupstream\u8f6c\u53d1\u3002 \u6b63\u5e38\u60c5\u51b5\u4e0b\u6211\u4eec\u7684HTTP Header\u5934\u90e8\u4fe1\u606f\u662f\u8fd9\u6837\u7684\uff1a \u8fd9\u91cc\u9762\u662f\u4e0d\u4f1a\u51fa\u73b0\u5e26\u4e0b\u5212\u7ebf\u7684HTTP Header\u7684\uff0c\u9664\u975e\u5f00\u53d1\u4eba\u5458\u81ea\u5b9a\u4e49\u3002\u6240\u4ee5Nginx\u5b98\u65b9\u9ed8\u8ba4\u662f\u5173\u95ed\u7684\u3002 \u4f46\u662f\u603b\u4f1a\u6709\u4e9b\u5f00\u53d1\u4eba\u5458\u4e0d\u5c0f\u5fc3\u4f7f\u7528\u4e86\u5e26\u4e0b\u5212\u7ebf\u7684HTTP Header\uff0c\u5c31\u4f1a\u78b0\u89e6\u8fd9\u4e2a\u5751\u3002 \u4e3a\u4e86\u7ed5\u5f00\u8fd9\u4e2a\u5751\uff0c\u6211\u4eec\u505a\u5982\u4e0b\u7684\u5b9e\u9a8c\u6765\u9a8c\u8bc1\u3002 \u9a8c\u8bc1 \u6211\u4eec\u4f7f\u7528Python(Flask)\u5199\u4e86\u4e00\u4e2a\u5c0fweb\u7a0b\u5e8f\uff0cFlask\u4ee3\u7801\u5982\u4e0b from flask import Flask, request, json app = Flask(__name__) @app.route('\/post', methods=['POST']) def register(): print('===request header: ') print(request.headers) if 'application\/json' in request.headers['Content-Type']: print('===recevied Content-Type: application\/json') print(request.json) else: print('===stream read') print(request.stream.read()) print(request.data) return 'OK' if __name__ == '__main__': app.run(host="0.0.0.0", port=15000, debug=True) \u7136\u540e\u6211\u4eec\u4f7f\u7528PostMan\u5411Flask\u768415000\u7aef\u53e3\u53d1\u8bf7\u6c42\uff0cHTTP […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13],"tags":[17,14],"_links":{"self":[{"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/posts\/1971"}],"collection":[{"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/comments?post=1971"}],"version-history":[{"count":1,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/posts\/1971\/revisions"}],"predecessor-version":[{"id":1974,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/posts\/1971\/revisions\/1974"}],"wp:attachment":[{"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/media?parent=1971"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/categories?post=1971"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/tags?post=1971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}