之前每次配置 nginx 中的 location 这个路径时都会很头疼,基本上每次都是靠碰运气,一个个去试,直到访问路径通了为止,这样一来到最后还是不知道怎么配置成功的,下次再配置时又需要一个个去试,既浪费时间又很没有效率,所以这次特意花了点时间去学习了一番,特此记录一下,也记录一下自己在测试的过程中踩过的一些坑。
location 匹配模式
主要有以下几种匹配模式:
- = 绝对匹配,如果匹配到了这个将停止匹配并处理该请求
- ~ 区分大小写的正则匹配
- ~* 不区分大小写的正则匹配
- ^~ 如果把这个前缀用于一个常规字符串,那么告诉 nginx 如果路径匹配那么不再去匹配正则
- / 通用匹配,任何请求都会匹配到
它们之间的匹配顺序为:
1.先匹配普通字符串,然后再匹配正则表达式。
2.一般情况下,匹配成功了普通字符串 location 后还会进行正则表达式的 location 匹配。当然有两种方法能够改变这种方式,一个是使用 = 进行绝对匹配,另一个则是使用 ^~ 前缀匹配,它在匹配到了普通字符 location 之后不会再去寻找正则匹配。
3.普通字符串匹配顺序是根据配置中的字符长度从长到短,也就是使用普通字符串的匹配顺序和 location 之间的先后顺序是无关的,最后 nginx 都会根据配置的字符长短来进行匹配。
4.正则表达式则是按照配置文件里的顺序来匹配,找到第一个匹配的正则表达式将停止搜索。
下面列举常见的几个匹配模式,在测试的过程中注意缓存的原因导致测试结果不正确,优先使用 Firefox 浏览器测试,Chrome 浏览器的缓存更严重。最好的还是每次测试访问时先清除一下缓存,这样才能保证我们的测试结果是正确的。还一个就是注意地址是否填写正确,不要在地址栏最后多出一个斜杠。最后就是我们所编辑的 nginx 配置文件一定要和我们启动的 nginx 配置文件一致。
绝对匹配
1 | location = / { |
上面的绝对匹配只是简单的配置了一个代理,将当前路径代理到另外一个服务的首页。
区分大小写的正则匹配
1 | location ~ image { |
上面的配置表示当用户访问 http://192.168.0.234:10080/image/test.jpg 时,将会转到当前服务的 /home/zhouxh/image/ 目录下去查找 test.jpg,也就是 http://192.168.0.234:10080/home/zhouxh/image/test.jpg。
通用匹配
1 | location /image { |
由于配置比较简单,上面的配置和上一个正则匹配的结果是一样的,只不过这里是通过普通的匹配方式匹配到 /image 这个 location。
location 中的 root 和 alias 的区别
1 | location /image { |
1 | location /image { |
上面的两个配置当用户访问 http://192.168.0.234:10080/image/test.jpg 时,访问的文件路径是不一样的,当使用 root 时路径为 http://192.168.0.234:10080/home/zhouxh/image/test.jpg,当使用 alias 时路径为 http://192.168.0.234:10080/home/zhouxh/test.jpg,两者的区别在于 root 是将实际访问文件路径即 root 后面的路径拼接 URL 中的路径,而 alias 是实际访问文件路径即 alias 后面的路径不去拼接 URL 中的路径。