nginx部分内置变量详解


nginx内置变量详解


1.nginx中$host、$http_host和$proxy_host区别

变量是否显示端口
$host不显示端口浏览器请求的ip,不显示端口
$http_host端口存在则显示浏览器请求的ip和端口号
$proxy_host默认80端口不显示,其它显示被代理服务的ip和端口号

1.1 配置反向代理时,接口请求报404问题

应用描述:前端应用域名为A(ww.a.com), 后端服务域名为B(www.b.com); 为了解决跨域问题,配置nginx反向代理如下:

...
proxy_set_header Host $host;
...
location ^~ /api/ {
	rewrite "^/api/(.*)$"  /$1 break;
	proxy_pass	http://www.b.com;
}

问题:这样配置完成后,接口报404问题。
解决
方案一:将proxy_set_header注释掉
方案二:修改反向代理配置,设置请求头Host,如下所示:

location ^~ /api/ {
	rewrite "^/api/(.*)$"  /$1 break;
	proxy_pass	http://www.b.com;
	proxy_set_header Host $proxy_host; //方式一:设置请求头host为www.b.com的ip和端口号
	proxy_set_header Host www.b.com; //方式二:设置请求host为www.b.com
}

2.$uri与 $request_uri的区别

$uri 指的是请求的文件和路径,不包含”?”或者”#”之类的参数

例如:
$uri: www.baidu.com/document

$request_uri 则指的是请求的整个字符串,包含了后面请求参数

例如:

$request_uri: www.baidu.com/document?x=1



3.nginx 配置$Query String

实际开发中经常有根据请求参数来路由到不同请求处理者的情况,根据POST请求参数需要些nginx插件,这里主要简单介绍下如何根据GET参数来路由。

1、location进行路径

最常见的是通过location进行路径匹配的时候,没办法是用正则表达一起捕获这个路径和querstring的。那么我想真的URL里面的Query String进行不同的rewrite,应该如何处理呢?答案就是$arg变量。
Nginx里面$query_string 与$args相同,存储了所提交的所有$query_string;比如&p=2887&q=test
如果想要在nginx里面单独访问这些变量。可以这样
比如$p变量可以这样访问 $arg_p

2、rewrite:

需求用到rewrite 其中有一个是要把a.php?id=2重定向到b-2.html
开始简单的写为
rewrite "^/a(.*)?(.*)$"  /b-$2.html  permanent;
总是不能正确的301到b-2.html
查资料发现

rewrite只能针对请求的uri进行重写,/a.php问号后面的是请求参数,在nginx用$query_string表示,直接写这样的一条重写肯定不会正确匹配,因为rewrite参数只会匹配请求的uri,在写重写的时候需要把$query_string变量追加到重写的uri后面,为了防止uri中的参数追加到重写后的uri,可以在后面加个问号:

if ($query_string ~ "id=(.*)") {
    set  $id  $1;
    rewrite ^/a.php$ /b-$id.html? permanent;
}

【示例1】

比如我们希望访问http://192.168.71.51:6061/do1.aspx?t=1212&c=uplog当url中的参数c为config或uplog的时候(忽略大小写)我们路由到其他地方:

下面是用这样一个实例讲述一下。

首先增加一个upstream:

……
upstream other {  
    server 192.168.71.41:2210;
     }
     ……

在location中加入判断:

……
location / { 
       if ( $query_string ~* ^(.*)c=config\b|uplog\b(.*)$ ){
         proxy_pass                  http://other; 
       }
……

【示例2】
要求是 如果请求中的$query_string包含"q=数字",301重新定向到首页交由index.php处理。 否则只是301重新定向到首页。

location ~* ^/wap/ {
#               if ( $http_user_agent ~* "(MSIE|bot|Spider|Slurp)" ) {
#               }
                if ($args ~* "p=\d+$") {
                        rewrite ^ $scheme://$host/?p=$arg_p? permanent;
                }
                #Rewrite 后面带一个?表示在重定向中使用query_tring
                rewrite ^/(.*)$ $scheme://$host/<del datetime="2012-01-24T14:18:20+00:00">?</del> permanent;
 }
注:关于rewrite后面的问号,其作用是去除后面的qrerystring,不加?的话,就是这样的比如原来的query_string是p=2887,不加问号的话 是重新定向到
http://ihipop.info/?2887&p=2887 多了一个&p=2887这样产生的 URI 不是很美观。


【示例3】

    location / {
        if ( $query_string ~* "p=\d+$" ) {
               proxy_pass                  http://www.ifeng.com;
        }
        proxy_pass                  http://www.baidu.com;
    }
    
通过如上配置,当访问nginx时,如果后面带有p=数字的参数(http://10.153.140.42/?p=1),就会跳转到ifeng,否则跳转到baidu。


4.$http_origin

$http_origin并不是nginx的内置参数,nginx支持取自定义的参数值,$http_XXX这个格式是nginx取请求中header的XXX的值的。这里取的是origin,而一般跨域请求都会将请求的来源放在origin中(浏览器会往跨域请求的header上面加origin这个header)。

```bash
request headers:
-------------------------------
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Host: 61.231.19.187:8089
If-Modified-Since: Sun, 16 Aug 2020 08:22:11 GMT
If-None-Match: "5f38ecb3-159"
Origin: http://abc.bdc.cn:8080
Referer: http://abc.bdc.cn:8080/1/tmp/index.html
User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36
```
nginx全局变量配置详解如下: 在nginx的配置文件中,可以使用全局变量来实现一些配置的判断和处理。全局变量在整个nginx配置中都是可见的,可以在不同的上下文中使用。 在引用中的示例中,主要使用了两个全局变量:$host和$request_uri。$host表示当前请求的主机名,$request_uri表示当前请求的URI。通过这些全局变量的值,可以进行条件判断和重定向跳转等操作。 另外,在nginx的配置中,还可以使用其他一些全局变量,例如: - $remote_addr:客户端的IP地址 - $http_user_agent:客户端的User-Agent信息 - $http_referer:客户端的Referer信息 $args:查询参数部分 - $scheme:请求的协议(http或https) 除了使用这些内置的全局变量外,还可以通过自定义变量来扩展nginx的功能。可以使用set指令来定义变量,并在配置中使用。 在nginx的全局配置中,可以使用全局块、events块和http块来进行配置。全局块中的配置影响全局,包括运行nginx的用户组、进程存放、日志、配置文件等。events块用于配置nginx服务器与客户端的网络连接,包括进程最大连接数、数据驱动模型、序列化等。http块是最常用的配置块,用于配置代理、缓存、日志和第三方模块等。 在http块中,可以嵌套多个server块,每个server块表示一个虚拟主机的参数配置。而在server块中,可以使用location块来配置请求路由和页面处理。 综上所述,nginx全局变量配置详解如上所述,主要包括内置的全局变量和自定义变量的使用,以及全局块、events块和http块的配置结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Nginx 配置详解](https://blog.csdn.net/u011262253/article/details/120941175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值