文章目录
复杂场景情况下我们可以使用
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 版权协议,转载请附上原文出处链接和本声明。