nginxlocation匹配及rewrite规则location匹配规则
1. 实例
server{
location = \ {
[配置A]
}
location / {
[配置B]
}
location = /images/ {
[配置C]
}
location ^~ /static/{
[配置D]
}
localtion ~* \.(gif|jpg|png){
[配置E]
}
}
2. location语法规则
语法:
location  = | ~ | ~* | ^~ | @  /url/{  //注意 =、~、~*、^~ 、@是location的匹配规则,”|“表⽰或者
......省略其他配置
}
规则说明:
符号含义
=字⾯精准匹配,如果匹配,则跳出匹配过程(不再进⾏正则匹配)
~开头区分⼤⼩写的正则匹配
~*开头不区分⼤⼩写的正则匹配
^~开头表⽰uri以某哥常规字符串开头,理解为匹配url路径即可
/通⽤匹配,在没有正则表达式匹配时,任何请求都会匹配到
@不是普通的location匹配,⽤于location内部重定向的变量
~
开头区分⼤⼩写的正则匹配
多个location配置的匹配顺序:
⾸先匹配:"="
其次匹配:"^~"
再匹配:⽂件location书写顺序
最后把所有请求交给通配符("/")
注意:每次匹配成功后,停⽌匹配,会按照本匹配的location处理请求
按照上⾯实例进⾏说明匹配顺序:
⾸先对⽐第⼀个location,如果匹配就会停⽌匹配,并按照配置A进⾏处理请求:
location = \ {
[配置A]
}
其次对⽐第⼆个location,如果匹配就会停⽌匹配,并按照配置D进⾏处理请求:
location ^~ /static/{
[配置D]
}
再按照顺序依此进⾏对⽐,直到到匹配的才会停⽌,并按照所匹配的配置*进⾏处理请求
如果以上⽆任何匹配项则会选择通⽤选项,并按照所匹配的配置B进⾏处理请求:
location / {
[配置B]
}
3. 应⽤举例
精准规则(=)
location = / {
root /var/ww/html/;
}
匹配url路径(^~)
location ^~ /static/ {
root /var/www/html/static;
}
忽略⼤⼩写(~*)
location ~* \.(png|gif|jpg){
root /var/www/html/;
}
location ~* /Test/ {
root /var/www/html/;
}
区分⼤⼩写(~)
location ~ /Test/{
root /var/www/html/;
}
默认匹配(所有规则都可匹配)
location / {
root /var/www/html;
内部跳转(@)
location @index_error{
root /var/www/error/
}
此规则表⽰匹配以 "/index/ "开头的请求,如果链接状态404,会匹配到这条规则
rewrite规则详解
nginx的rewrite功能和apache⼀样,rewrite的主要功能是实现RUL地址的重定向。Nginx的rewrite功能是由PCRE软件⽀持,rewrite模块即ngx_http_rewrite_module模块。从某种意义上可以说为了美观或者搜索引起的友好搜索,提⾼排名等
1.实例
server{
listen 80;
server_name ;
if($host != '' ){
rewrite ^/(.*)$ /$1 permanent;
}
location ~.*\.(png|gif|jpg){
return 403;
}
}
语法:
rewrite  regex  replacement  [flag]
rewrite:rewrite重写的关键字不可省略
regex:这⾥写的是正则表达式
replacement:这⾥是重新内容
flag:这⾥是最后的flag标记
flag标记说明:
flag标记说明
last也就是apache⾥的(L)标记,表⽰完成rewrite,URL地址不会改变
break本条规则匹配成功后,会停⽌匹配,不再匹配后⾯的规则,URL地址不会改变
redirect返回302临时重定向,浏览器地址会显⽰跳转后的URL地址
permanent返回301永久重定向,浏览器地址栏显⽰跳转后的URL地址,Nginx返回response状态码301
相关符号说明:
符号说明
*代表前⾯0或者多个字符
+代表前⾯1或者多个字符
代表前⾯0或1个字符
^代表字符串的开始位置
$代表字符串结束位置
$n代表字符串结束第n个参数
.通配符,代表任何字符
3.应⽤实例
多域名跳转到同⼀域名
server{
listen 80;
server_name ;
if($host != ''){
rewrite ^/(.*)$ /$1 permanent;
}
}
当访问 "" 时会⾃动跳转到 "",这⾥出现 "if" 语句⽤于判断,判断结果为true则执⾏语句内部的 rewrite重写
当⽂件不存在时重定向到指定⽂件
server{
listen 80;
server_name ;
if(!-e $request_filename){
rewrite  ^/test/(.*)$ /test1/$1 permanent;
}
}
当访问 "test" ⽬录下的⽂件或⽬录不存在时,则跳转到 "test1"下⾯的此⽂件或者⽬录,跳转后会将URL进⾏转换
server{
listen 80;
server_name ;
if(!-e $request_filename){
rewrite ^/test/(.*)$ index.html last;
}
}
表⽰当访问 "test" ⽬录下的⽂件或⽬录不存在时,则重定向到 "index.html"⽂件,跳转后URl不会进⾏转换
server{
listen 80;
server_name ;
if(!-e $request_filename){
rewrite ^/test/([0-9a-z]+)/([0-9a-z]+)/(.*)$ /test/$1$2$3 permanent;
}
}
⽬录切换,表⽰将原⽬录转换成其他⽬录,【0-9a-z】表⽰转换后⽬录名称
禁⽌访问.sh后缀的⽂件
server{
......其他配置
location ~.*\.(sh)${
return 405;
}nginx停止命令
表⽰当访问 "*.sh"的⽂件就会返回405错误
匹配⽤户浏览器代理信息
server{
listen 80;
server_name ;
if ( $http_user_agent ~* ("Android")|(iPhone)){
rewrite ^/test/(.*)$ /test/$1  permanent;
}
}
表⽰当匹配到浏览代理为Android和iPhone时进⾏重定向 "test"⽬录下的⽂件,改变访问的地址禁⽌htaccess
server{
location ~//.ht {
deny all;
}
}
4.⽂件⽬录匹配
参数介绍
-f判断⽂件是否存在返回值true为存在
!-f判断⽂件是否存在返回值false为不存在
-d判断⽬录是否存在返回值true为存在
!-d判断⽬录是否存在返回值true为不存在
-e判断⽂件或⽬录是否存在返回值true为存在
!-e判断⽂件或⽬录是否存在返回值true为不存在
-x判断⽂件是否可执⾏返回值true为可执⾏
!-x判断⽂件是否可执⾏返回值true为不可执⾏
举例说明:
server{
listen 80;
server_name ;
if(!-e $request_filename){
rewrite  ^/test/(.*)$ /test1/$1 permanent;
}
}
判断⽂件或⽬录是否存在

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。