Nginx使用IF解决复杂的跨域、代理问题

  • Post author:
  • Post category:其他


复杂场景情况下我们可以使用

IF

解决跨域问题,根据请求条件进行代理访问



一、配置示例



1. 请求地址中包含param1=0的配置

location ^~ / {

    proxy_http_version 1.1;
    proxy_set_header Host $host:$server_port;

    if ( $request_uri ~* 'param1=0' ) {
        proxy_pass http://127.0.0.1:8080;
        break;
    }
    proxy_pass http://127.0.0.1:9090/;

}

  • 说明:上述示例表示地址访问

    /

    时,如果地址中包括

    param1=0

    则走代理服务器

    http://127.0.0.1:8080

    ;否则走

    http://127.0.0.1:9090/

    |



2. 请求地址中参数中有param1=0则到指定域名

location ^~ / {

    proxy_http_version 1.1;
    proxy_set_header Host $host:$server_port;

    if ( $args ~ 'param1=0' ) {
        proxy_pass http://127.0.0.1:8080;
        break;
    }
    proxy_pass http://127.0.0.1:9090/;
}



二、Nginx IF 语法

# 注意下面的空格,在 IF、括号、变量、比较符号、值 之间有空格
if ( 变量 比较符号 值 ) {
   ...
}


注意空格,在 IF、括号、变量、比较符号、值 之间有空格!



注意空格,在 IF、括号、变量、比较符号、值 之间有空格!



注意空格,在 IF、括号、变量、比较符号、值 之间有空格!



三、Nginx 常用变量名称

变量 描述
$args 这个变量等于请求行中的参数,同 $query_string
$arg_foo 这个变量等于请求行中的参数foo的值
$content_length 请求头中的 Content-length 字段
$content_type 请求头中的 Content-Type 字段
$document_root 当前请求在 root 指令中指定的值
$host 请求主机头字段,否则为服务器名称
$http_user_agent 客户端 agent 信息
$http_x-request-header 请求头 x-request-header 的值,全小写的header
$http_cookie 客户端 cookie 信息
$limit_rate 这个变量可以限制连接速率
$request_method 客户端请求的动作,通常为 GET 或 POST
$remote_addr 客户端的 IP 地址
$remote_port 客户端的端口
$remote_user 已经经过 Auth Basic Module 验证的用户名
$request_filename 当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成
$scheme HTTP 方法(如 http,https)
$server_protocol 请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值
$server_name 服务器名称
$server_port 请求到达服务器的端口号
$request_uri 包含请求参数的原始 URI,不包含主机名,如:”/test/getApi?param=1”
$uri 不带请求参数的当前 URI,$uri 不包含主机名,如 ”/test/getApi”
$document_uri 与 $uri 相同



四、Nginx IF 比较符号

比较符号 描述
== 等值比较
~ 与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写
~* 与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写
!~ 与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写
!~* 与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写
-f, !-f 判断指定的路径是否为存在且为文件
-d,!-d 判断指定的路径是否为存在且为目录
-e, !-e 判断指定的路径是否存在,文件或目录均可
-x,!-x 判断指定路径的文件是否存在且可执行



五、常见问题及解决方案



1. nginx: [emerg] unknown directive “if($

  • 原因:IF 语法不正确
  • 解决方法:在 IF、括号、变量、比较符号、值 之间有空格,增加空格



2. nginx: [emerg] “xxxx” directive is not allowed here in xxxxx

  • 原因:IF 语法中不能有set请求头等操作
  • 解决方法:在 IF 语法中删除set请求头等操作



3. HTTP 404

  • 原因:代理错误
  • 解决方法:检查代理方式及代理逻辑,另外查看控制台输出的错误信息



六、Nginx 变量大全

https://nginx.org/en/docs/varindex.html



版权声明:本文为qq_24598601原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。