1、location
1.1、location 的匹配规则
location 的语法规则:
location [=|~|~*|^~] /uri/ { ... }
符号含义:
符号 | 含义 |
= |
开头表示精确匹配 |
^~ | 开头表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。nginx 不对 url 做编码,因此请求为/static/20%/aa ,可以被规则 ^~/static/ /aa 匹配到(注意是空格) |
~ | 开头表示区分大小写的正则匹配 |
~* | 开头表示不区分大小写的正则匹配 |
/ | 通用匹配,任何请求都会匹配到 |
同一个 server 中有多个 location 配置的情况下的匹配顺序为:
-
首先匹配
=
-
其次匹配 ^~
-
其次是按文件中顺序的正则匹配
-
最后是交给 / 通用匹配
-
当匹配成功时候会立即停止匹配,按当前匹配规则的 location 来处理请求
示例:
location = / { #规则A } location = /login { #规则B } location ^~ /static/ { #规则C } location ~ \.(gif|jpg|png|js|css)$ { #规则D } location ~* \.png$ { #规则E } location / { #规则F }
效果:
访问根目录 /, 比如 http://localhost/ 将匹配规则 A 访问 http://localhost/login 将匹配规则 B,http://localhost/register 则匹配规则 F 访问 http://localhost/static/a.html 将匹配规则 C 访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则 D和规则 E,但是规则 D 顺序优先,规则 E不起作用,而 http://localhost/static/c.png则优先匹配到规则 C 访问 http://localhost/a.PNG 则匹配规则 E,而不会匹配规则 D,因为规则 E 不区分大小写 访问 http://localhost/category/id/1111 则最终匹配到规则 F,因为以上规则都不匹配,这个时候应该是 nginx 转发请求给后端应用服务器,比如 FastCGI(PHP),tomcat(jsp),nginx 作为反向代理服务器存在
1.2、root(服务器资源路径)
Nginx 中的 root 可以在 location 或者直接在 server 中配置,root 指定的是资源存放在服务器中的路径。root 既可以是绝对路径,也可以是相对路径,以 / 开头即为绝对路径。比如 location 中的 root 指定的是这个 location 规则所匹配的资源所存放的资源路径。
相对路径使用示例:
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } }
上面 location 中 root 所指向的 html 就是一个相对路径,相对的是当前这个配置文件的路径。假设此配置文件的位置是 /etc/nginx/conf.d,那么这个 html 的绝对路径就是 /etc/nginx/conf.d/html/。因此为避免出现不必要的麻烦,在配置 root 路径的过程中最好用绝对路径。
绝对路径使用示例:
server { listen 80; server_name localhost; location / { root /usr/local/nginx/html; index index.html index.htm; } location /webTestProject/ { root /usr/myTestData/; index index.html index.htm; } }
请注意,上面当我们访问 http://ip/webTestProject 时,实际上是访问了服务器中的 /usr/myTestData/webTestProject 路径。也就是说,当配置 root 时,最后访问到的资源路径会加上 location 中匹配到的 url。
1.2.1、server中的root和location的root的区别
如果我们同时在 server 和 location 中都设置了 root 路径,例如:
server { listen 80; server_name localhost; root /usr/local/nginx2/html; location / { root /usr/local/nginx/html; index index.html index.htm; } }
当我们访问服务器命中了 location 的配置时,nginx 的 location 会优先匹配到此代码块,会指向 location 中所配置的 root , server 中的 root 不会生效。当 nginx 找不到匹配到的 location 或者 location 中没有配置 root 时,此时才会使用 server 中的 root 配置。
1.3、root 和 alias 的区别
当我们使用 root 指定资源的路径时,最终访问的服务器资源路径会自动加上 location 中的 url 。而 alias 不会,alias 所指定的资源路径就是你所访问的资源路径,这就是它们的区别。
比如说想要把服务器的 /home/source 目录作为资源目录,那么需要如下配置:
location /source/ { #识别url路径后,nginx会到/home/文件路径下,去找到/source目录 root /home/; }
我们可以会错误地像下面这样配置:
location /source/ { #识别url路径后,跳转到/home/source目录路径下,去再找/source root /home/source; }
如果按照上面这样的配置方式会出现404的情况,因为/home/source 目录下不一定有/source目录
上面的匹配方式比较繁琐,不符合常规逻辑,此时我们可以使用 alias 解决。
比如说想要把 /home/source 目录作为资源目录,使用 alias,那么需要如下配置:
location /source/ { #识别url路径后,直接匹配/home/source目录 alias /home/source; }
1.4、index(默认页面)
Nginx 可以在 location 中配置 index,index 配置的是网站初始页,也就是默认页面。该指令拥有默认值,index index.html ,即如果没有给出index,默认初始页为index.html
比如配置如下:
server { listen 80; server_name localhost; location /webTestProject/ { root /usr/myTestData/; index index.html index.htm; } }
我们可以直接访问 http://ip//webTestProject/,会默认命中服务器中的 /usr/myTestData/webTestProject/index.html 资源。