• nginx proxy_set_header设置、自定义header


    1、背景

    XXX

    2、语法

    语法proxy_set_header field value;
    默认值proxy_set_header Host $proxy_host;
    proxy_set_header Connection close;
    上下文http, server, location

    允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:

    1. proxy_set_header Host $proxy_host;
    2. proxy_set_header Connection close;

    2.1  nginx是支持读取非nginx标准的用户自定义header的,但是需要在http或者server下开启header的下划线支持:

    underscores_in_headers on;

    2.2 举例

    比如我们自定义header为X-Real-IP,通过第二个nginx获取该header时需要这样:

    $http_x_real_ip; (一律采用小写,而且前面多了个http_)

    2.3  如果需要把自定义header传递到下一个nginx:

    如果是在nginx中自定义采用proxy_set_header X_CUSTOM_HEADER $http_host;

    如果是在用户请求时自定义的header,
    例如curl –head -H “X_CUSTOM_HEADER: foo” http://domain.com/api/test
    则需要通过proxy_pass_header X_CUSTOM_HEADER来传递

    2.4  语法

    underscores_in_headers on|off
    默认值:off
    使用字段:http, server
    是否允许在header的字段中带下划线

    3、内置变量

    核心模块支持内置变量,其名称与Apache中的变量名称相对应。

    常用变量如下表格

    名称说明demo值
    $remote_addr客户端的ip地址
    $http_x_forwarded_for相当于网络访问路径待验证
    $remote_user客户端用户名称,认证用
    $remote_port客户端端口号看似随机
    $time_local用来记录访问时间与时区
    $request用来记录请求的url与http协议
    $status用来记录请求状态;成功是200
    $body_bytes_sent记录发送给客户端文件主体内容大小
    $http_referer用来记录从那个页面链接访问过来的
    $http_user_agent记录客户端浏览器的相关信息
    $host

    请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名    ngxin.arg.test

    $hostname机器名使用 gethostname系统调用的值
    $server_addr

    服务器地址,如果没有用listen指明服务器地址,

    使用这个变量将发起一次系统调用以取得地址

    (造成资源浪费)

    127.0.0.1

    nginx 所在服务器IP地址

    $server_name请求到达的服务器名监听 server  下的server_name : localhost
    $server_port请求到达的服务器端口号监听 server 下的 listen 端口 : 80
    $server_protocol请求的协议版本,“HTTP/1.0"或"HTTP/1.1”

    “HTTP/1.0"或

    "HTTP/1.1”

    $scheme所用的协议,比如http或者是httpshttp
    $request_body

    这个变量(0.7.58+)包含请求的主要信息。

    在使用proxy_pass或fastcgi_pass指令的location中比较有意义    

    $request_body_file客户端请求主体信息的临时文件名
    $request_completion

    如果请求成功,设为"OK";

    如果请求未完成或者不是一系列请求中最后一部分则设为空

    $request_filename

    当前请求的文件路径名,

    比如/opt/nginx/www/test.php

    $request_method请求的方法,比如"GET"、"POST"等GET
    $request_uri请求的URI,带参数

    请求的URI,

    带参数    /a/b/c/?d=test&e=123

    &username=

    %E7%94%A8%E6%88%B7

    $uri请求的URI,可能和最初的值有不同,比如经过重定向之类的/a/b/c/
    $http_cookiecookie 信息
    $content_type请求信息里的"Content-Type"
    $content_lengthHTTP请求信息里的"Content-Length"
    $arg_**可具体为请求中的某个参数$arg_d=test
    $args请求中的参数

    d=test&e=123&u

    sername=%E7%94%

    A8%E6%88%B7

    $binary_remote_addr远程地址的二进制表示
    $document_root针对当前请求的根路径设置值
    $document_uri与$uri相同/a/b/c/
    $http_via最后一个访问服务器的Ip地址
    $is_args如果请求行带有参数,返回“?”,否则返回空字符串
    $limit_rate对连接速率的限制
    $nginx_version当前运行的nginx版本号
    $pidworker进程的PID
    $query_string与$args相同
    $realpath_root按root指令或alias指令算出的当前请求的绝对路径。其中的符号链接都会解析成真实文件路径

    3、工作原理

    XXXX

    4、总结

           proxy_set_header 就是可设置请求头-并将头信息传递到服务器端。不属于请求头的参数中也需要传递时 重定义下就行啦。

  • 相关阅读:
    Java算法探秘:二分查找详解
    CDGA数据治理工程师考试心得
    Redis 排障:你永远不知道告警和下班,谁先到来?
    using virtualbox in ubuntu
    oracle 远程连接数据库
    刷题记录(NC13822 Keep In Line,NC16663 合并果子,NC16430 蚯蚓)
    论文翻译: FREEVC:朝着高质量、无文本、单次转换声音的目标迈进
    uniapp微信小程序分布步骤
    【Java每日一题】——第二十八题:编程定义一个学生类汽车类Car(2023.10.12)
    【图像处理与机器视觉】图像处理概述与像素
  • 原文地址:https://blog.csdn.net/yh250648050/article/details/133988905