Skip to content

location

location 主要是根据 Server 匹配到的请求路径和关键字去响应和处理。

语法:

nginx
location optional_modifier location_match { ... } 

location @name { ... }

其中:optional_modifier 是匹配条件,location_match 是匹配的样式,{} 是要执行的操作。匹配条件主要有两种: 正则/前缀字符。

匹配规则

正则匹配

类型含义匹配方式优先级样式
~普通正则-敏感正则符号3location ~.(jpe?g)$ {}
~*普通正则-不敏感正则符号3location ~.(jpe?g)$ {}

普通匹配

类型含义匹配方式优先级样式
=精确匹配前缀1location = /image {}
^~优先匹配前缀2location ^~ /page {}
@内部重定向前缀location @name {}
/通用匹配前缀4location / {}

使用原则:

前提:根据请求 url,获取 uri 即除了域名/IP之外的部分,用于 location 匹配

  • 如果有精确匹配,即 =/路径,找到匹配项后,结束匹配。
  • location = 路径 {} 或者 location 完整路径 {}
  • 如果有优先匹配,即 ^~,找到匹配项后,结束匹配。
  • location ^~ 路径。如果有正则匹配,即 ~|!~|~|!~,找到匹配项后,不会终止继续匹配,直到找到合适的
  • location ~ 正则字符 {} ,如果匹配到多个,则使用location_match最长的。

常见示例:

nginx
location = / {       	
    location ~ \.(gif|jpg|png|js|css)$ { 	
        location !~ \.xhtml$ {
			\ # 精确规则A            # 正则规则D                 # 通用规则G
        }              	
    }                   		
}

location = /login {     
    location ~ \.png$ {          	
        location / {
            \ # 精确规则B            # 正则规则E                 # 通用规则H
        }              	
    }                   		
}


location ^~ /static/ {   
    location !~ \.xhtml$ {
        \ # 优先规则C            # 正则规则F
    }              	
}

访问效果如下:

访问根目录/, 比如 http://a.com/ 将匹配规则A

访问 http://a.com/login 将匹配规则B

访问 http://a.com/static/a.html 将匹配规则C

访问 http://a.com/a.gif, http://a.com/b.png 规则D和E均适合,按顺序优先使用规则D,而 http://a.com/static/c.png 则优先匹配到规则C

访问 http://a.com/a.PNG 则匹配规则E,因为规则E不区分大小写。

访问 http://a.com/a.XHTML 使用规则F。

访问 http://a.com/category/id/1111 则最终匹配到规则H。

@name示例

@ 用来定义一个命名 location 。主要用于内部重定向,不能用来处理正常的请求。其用法如下:

nginx
location / {
  try_files $uri $uri/ @custom
}

location @custom {
  \ # ...do something
  \ # custom 命名的 location 中不能再嵌套其它的命名 location
}

关于 URL 尾部的 / 有如下注意事项:

  • location 中的 location_match 字符有无"/"不受影响。/user/ 等同 /user。
  • 对于访问网站域名(http://sswang.com/),尾部有无 / 不受影响。因为浏览器会自动补全 /
  • 对于访问网站域名后面的路径(http://sswang.com/other/)。尾部的 / 很重要。

URL尾部的 / 表示目录,没有 / 表示文件,而且文件找不到的话,会发生重定向。

/other/:表示服务器会自动去该目录下找对应的默认文件。

/other:表示服务器会先去找 other 文件,找不到的话会将 other 当成目录,重定向到 /other/,去该目录下找默认文件。

location 常见动作

在 location 内部常用的功能属性非常多,常见的基本属性、临时跳转、访问控制、目录列表等。

基本属性

nginx
location / {
    root  /var/www/html;					# 指定响应请求的文件所在路径
    index  index.php index.html index.htm;	# 指定响应请求的默认文件名称
    expires 7d;								# 指定响应请求的文件过期时间,一般用于静态文件
    try_files $uri $uri/ =404;				# 如果 root 指定的路径下有查找的文件,就返回,否则报错
}

临时跳转

nginx
location = /test/ {
  return 302 http://sswang.com/;			# 访问旧url的时候,临时跳转到新url,两个url均不失效	
}

访问控制

nginx
location /nginx-status {
  stub_status on;  					# 开启 nginx 的状态页面,默认关闭
  allow 192.168.8.14;				# 允许的访问地址
  deny all;							# 默认进制所有访问
}

注意:

该功能依赖于 ngx_http_stub_status_module 模块(默认没有安装,需要定制化安装)

目录列表

nginx
location /upload {

  alias  /var/www/upload;	# 指定查看文件列表路径(绝对路径)
  autoindex on;       		# 开启目录自动索引
  autoindex_exact_size off; # 默认on,显示文件确切大小(bytes)。off表示显示文件的大概大小(kB/MB/...)
  autoindex_localtime on;  	# 默认off,显示的文件时间为GMT时间。on表示显示文件的服务器时间
}

注意:

该 alias 指定的目录下,不允许出现 index 属性指定的文件。

root VS alias

root 和 alias 所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别

root 表示 location 匹配内容的相对路径

alias 表示 一个绝对路径,而且必须以 / 结尾

一般情况下,在 location /中配置 root,在 location /other 中配置 alias

nginx
效果一:							  效果二:

location /img/ {            		location /img/ {
	alias /var/www/image/;         		root /var/www/image;
}                      				}

效果一:访问 http://localhost/img/ ,nginx 找 /var/www/image/ 目录下的文件

效果二:访问 http://localhost/img/ ,nginx 找 /var/www/image/img/ 目录下的文件