nginx的url配置解析相关笔记

要掌握nginx的url配置解析,我建议先看看正则表达式,这样上手nginx的url配置会快速上手。这是我入门的正则表达式

1. 匹配QQ号必须为5位到12位数字  ^\d{5,12}$

12345    
123456789101


2. 电话号码     \(?0\d{2}[-) ]?\d{8}|0\d{3}-\d{7}

(010)88886666,或022-22334455,或02912345678
010)12345678或(022-87654321或029 12345678

0\d{2}-\d{8}|0\d{3}-\d{7}:
一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。



3. 匹配url路径
https?://([^/\n]+/)*
(.+\/)

http://xxx.com/234234/fsa/23432.jpg
http://xxdfsax.com/hfgg/fsa/qrdsfsaf1.jpg
https://2342342afsdfds.com/sdfsdf/sdfcf34/fsa/23fwersdf.jpg


4. 匹配url路径后面的文件名
[^/]*\.[^/\n]+$

http://xxx.com/234234/fsa/23432.jpg
http://xxdfsax.com/hfgg/fsa/qrdsfsaf1.jpg
https://2342342afsdfds.com/sdfsdf/sdfcf34/fsa/23fwersdf.jpg

完成简单的正则表达式,接着在看看nginx的location配置规则

location:http核心模块
语法:location [=|~|~*|^~|@] /uri/ { ... } 
默认值:no 
使用字段:server 
这个参数根据URI的不同需求来进行配置,可以使用字符串与正则表达式匹配,如果要使用正则表达式,你必须指定下列前缀:
1、~* 不区分大小写。
2、~ 区分大小写。
要确定该指令匹配特定的查询,程序将首先对字符串进行匹配,字符串匹配将作为查询的开始,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配查询的第一个正则表达式找到后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果。
在一些操作系统,如Mac OS X和Cygwin,字符串将通过不区分大小写的方式完成匹配(0.7.7),但是,比较仅限于单字节的语言环境。
正则表达式可以包含捕获(0.7.40),并用于其它指令中。
可以使用“^~”标记禁止在字符串匹配后检查正则表达式,如果最确切的匹配location有这个标记,那么正则表达式不会被检查。
使用“=”标记可以在URI和location之间定义精确的匹配,在精确匹配完成后并不进行额外的搜索,例如有请求“/”发生,则可以使用“location = /”来加速这个处理。

即使没有“=”和“^~”标记,精确的匹配location在找到后同样会停止查询。

nginx的location配置实际例子

location ~ .*\.(sh|flv|mp3)$
{
   return 403;	
}

location ^~ /html/scripts/loadhead_1.js {
	access_log off;
	root /opt/lampp/htdocs/web;
	expires 600;
	break;
}
下面是各种查询方式的总结:
1、前缀“=”表示精确匹配查询,如果找到,立即停止查询。
2、指令仍然使用标准字符串,如果匹配使用“^~”前缀,停止查询。
3、正则表达式按照他们在配置文件中定义的顺序。

4、如果第三条产生一个匹配,这个匹配将被使用,否则将使用第二条的匹配。

例 :
Shell代码
location  = / {  
  # 只匹配 / 的查询.  
  [ configuration A ]  
}  
location  / {  
  # 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。  
  [ configuration B ]  
}  
location ^~ /images/ {  
  # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。  
  [ configuration C ]  
}  
location ~* \.(gif|jpg|jpeg)$ {  
  # 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处理。  
  [ configuration D ]  
}  
各请求的处理如下例:
·/ -> configuration A 
·/documents/document.html -> configuration B 
·/images/1.gif -> configuration C 
·/documents/1.jpg -> configuratio
注意你可以以任何顺序定义这4个配置并且匹配结果是相同的,但当使用嵌套的location结构时可能会将配置文件变的复杂并且产生一些比较意外的结果

网上这个挺好的nignx高级应用之location url匹配

精确匹配和前缀匹配都不支持正则匹配,一般前缀匹配通常用于匹配文件夹,如配置静态文件

大原则匹配优先级
精确匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全匹配
小原则同级匹配
1. 正则匹配成功后停止匹配,非正则匹配成功还会接着匹配,选取最长匹配

2. 是否正则,是否最长


rewrite语法

rewrite
语法:rewrite regex replacement flag 
默认值:none
使用字段:server, location, if 
按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。

注意重写规则只匹配相对路径而不是绝对的URL,如果想匹配主机名,可以加一个if判断,如:

if ($host ~* www\.(.*)) {  
  set $host_without_www $1;  
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1为'/foo',而不是'www.mydomain.com/foo'  
}  
可以在重写指令后面添加标记。
如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
标记可以是以下的值:
·last - 完成重写指令,之后搜索相应的URI或location。
·break - 完成重写指令。
·redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。

·permanent - 返回301永久重定向。


nginx全局变量

arg_PARAMETER    #这个变量包含GET请求中,如果有变量PARAMETER时的值。
args                    #这个变量等于请求行中(GET请求)的参数,如:foo=123&bar=blahblah;
binary_remote_addr #二进制的客户地址。
body_bytes_sent    #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。
content_length    #请求头中的Content-length字段。
content_type      #请求头中的Content-Type字段。
cookie_COOKIE    #cookie COOKIE变量的值
document_root    #当前请求在root指令中指定的值。
document_uri      #与uri相同。
host                #请求主机头字段,否则为服务器名称。
hostname          #Set to themachine’s hostname as returned by gethostname
http_HEADER
is_args              #如果有args参数,这个变量等于”?”,否则等于”",空值。
http_user_agent    #客户端agent信息
http_cookie          #客户端cookie信息
limit_rate            #这个变量可以限制连接速率。
query_string          #与args相同。
request_body_file  #客户端请求主体信息的临时文件名。
request_method    #客户端请求的动作,通常为GET或POST。
remote_addr          #客户端的IP地址。
remote_port          #客户端的端口。
remote_user          #已经经过Auth Basic Module验证的用户名。
request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。
request_method    #GET或POST
request_filename  #当前请求的文件路径,由root或alias指令与URI请求生成。
request_uri          #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。
scheme                #HTTP方法(如http,https)。
server_protocol      #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
server_addr          #服务器地址,在完成一次系统调用后可以确定这个值。
server_name        #服务器名称。
server_port          #请求到达服务器的端口号。


你可能感兴趣的:(nginx)