一、location [=|~|~*|^~|@] /uri/ { ... }
1、~ 为区分大小写匹配
2、~* 为不区分大小写匹配
3、!~ 为区分大小写不匹配
4、!~* 为不区分大小写不匹配
5、= 开头表示精确匹配
6、/ 通用匹配,所有请求都会被匹配到
有多个location配置的情况下,先走 = ,然后是^~,其他的则按书写顺序来依次匹配,最后是通用匹配 / ;
代码如下 | 复制代码 |
nginx不对url进行编码,例如:/20%/ 可以被 / / 匹配到。 示例: 匹配所有请求,因为请求都是以/开头 location / { #rule } 仅仅匹配 / |
匹配过程如下:
第一步:进行字符串匹配,找到最合适的那一个
第二步:进行正则表达式匹配,找到匹配上的第一个
第三步:如果第二步匹配上了,则用第二步匹配的结果,否则用第一步匹配的结果
从上面可以看出来,正则表达式的优先级要高一些
二、rewrite 语法
last - 基本上都用这个Flag。
break - 中止Rewirte,不在继续匹配
redirect - 返回临时重定向的HTTP状态302
permanent - 返回永久重定向的HTTP状态301
1、下面是判断表达式:
-f 和 !-f 用来判断是否存在文件
-d 和 !-d 用来判断是否存在目录
-e 和 !-e 用来判断是否存在文件或目录
-x 和 !-x 用来判断文件是否可执行
全局变量:
2、下面是可以用作判断的全局变量示例
代码如下 | 复制代码 |
例:http://www.111cn.net /post.php $host:www.111cn.net $server_port:80 $request_uri:http://www.111cn.net /post.php $document_uri:/post.php $document_root:/home/web $request_filename:/home/web/blog/post.php |
配置示例:
代码如下 | 复制代码 |
server{ listen:80; server_name:www.111cn.net ; root /home/web/blog; location ~* .(jpg|png|css|js)${ expires 10h; break; } } |
例子
代码如下 | 复制代码 |
location = / { # 只匹配 / 查询。 [ configuration A ] } location / { # 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。 [ configuration B ] } location ^~ /images/ { location ~* .(gif|jpg|jpeg)$ { |
实际测试,下面为一个完整的nginx域名配置,使用return来进行区分匹配上哪个location
代码如下 | 复制代码 |
server{ listen 80; server_name want.abc.com; charset gbk; access_log logs/want_access.log main; error_log logs/want_error.log; location = / { return 100;} 解释:先进行"="的完全匹配,如果匹配上,则搜索停止 解释:正则表达式没有匹配上,就是用字符串匹配 解释:进行字符串匹配,匹配上了,同时有"^~",则停止搜索 解释:正则表达式匹配上了,停止搜索 解释:字符串匹配上了,正则表达式匹配上了,但是优先使用正则表达式匹配 |
例子请求:
代码如下 | 复制代码 |
/ -> configuration A /documents/document.html -> configuration B /images/1.gif -> configuration C /documents/1.jpg -> configuration D |
注意:按任意顺序定义这4个配置结果将仍然一样。
(location =) > (location 完整路径 ) >(location ^~ 路径) >(location ~*, ~ 正则) >(location 部分起始路径) 正则表达式根据配置文件中的前后顺序影响匹配, 前面的优先匹配. 其它则根据匹配长度来优先匹配.