目录
location和rewrite是两个用于处理请求的重要模块,它们都可以根据请求的路径进行匹配和处理。
1:简单匹配
简单匹配是按照字面量路径来匹配请求的URL。这种匹配方法是最直接且最容易理解的。
location /images/ { ?
? ? # 匹配任何以/images/开头的URL ?
}
2:最长字符串匹配
当有多个location使用简单匹配时,Nginx会选择匹配路径最长的那个。
location / { ?
? ? # 匹配所有URL,但优先级较低 ?
} ?
location /images/ { ?
? ? # 匹配以/images/开头的URL,优先级高于上面的location / ?
}
3:正则表达式匹配
使用正则表达式可以定义更复杂的路径匹配规则。正则表达式匹配以~*(不区分大小写)或~(区分大小写)开始。
location ~* \.(gif|jpg|png)$ { ?
? ? # 匹配所有以.gif、.jpg或.png结尾的URL,不区分大小写 ?
}
4:通配符匹配
Nginx不支持像Apache那样的通配符(如*),但可以使用正则表达式来达到类似的效果。然而,有时候提到的通配符匹配实际上是指正则表达式的使用。
5:精确匹配
使用=可以实现精确匹配,即完全匹配指定的路径。
location = /logo.png { ?
? ? # 只匹配/logo.png这个URL ?
}
6:匹配优先级
当存在多个可能匹配的location时,Nginx会按照一定的优先级顺序来选择一个进行处理。优先级从高到低大致如下:
精确匹配(=)具有最高优先级;
其次是按文件中的顺序匹配的正则表达式(~和~*),先被定义的先匹配;
然后是最长字符串匹配;
最后是匹配任意路径的location /。
7:命名位置
虽然这不是一种路径匹配方法,但值得一提的是,你可以使用@符号创建命名的location,这些位置不能直接由客户端请求访问,但可以在内部重定向或作为其他指令的目标。
location / { ?
? ? try_files $uri $uri/ @custom; ?
} ?
location @custom { ?
? ? # 这里是自定义错误页面或其他处理逻辑 ?
}
?
1:正则表达式匹配:
rewrite模块支持使用正则表达式进行匹配和替换。正则表达式可以用来描述复杂的匹配模式,并实现精确的URL重写。
rewrite ^/oldpath(.*)$ /newpath$1 permanent;
2:位置匹配:
rewrite模块也支持基于请求的URL位置进行匹配和重写。可以使用location块中定义的匹配规则来指导rewrite操作。
location = /oldpage { ?
? ? rewrite ^ /newpage; ?
}
3:替换参数
在重写URL时,可以使用替换参数来修改URL中的某些部分。例如,使用$1到$9来表示正则表达式中的捕获组,并替换到新的URL中。
rewrite ^/(.*)/(.*)$ /profile.php?user=$1&id=$2 last;
4:重定向
使用rewrite模块可以将请求重定向到其他URL。通过指定重定向的目标URL,可以将用户请求转发到其他服务器或地址。
rewrite ^/oldurl$ /newurl redirect;
5:临时重定向
使用last关键字可以将重定向标记为临时重定向,这意味着浏览器会收到一个临时的响应,并自动重新发起新的请求到目标URL。
rewrite ^/oldurl$ /newurl last;
6:永久重定向
使用permanent关键字可以将重定向标记为永久重定向,这意味着浏览器会收到一个永久的响应,并记住新的URL,以后直接访问旧的URL时会直接跳转到新的URL。
rewrite ^/oldurl$ /newurl permanent;
?