写在前面的话

前面我们谈了 nginx 基础的 WEB 服务配置以及定制我们的日志显示格式,接下来我能更加详细的说说 server 字段。

location 字段

在 Server 中,如果我们只是一个 WEB 服务,其实是不需要先前的 location 匹配的。

所以在之前的 demo.conf 中,我们完全可以直接写成:

# 80 端口测试
server {
listen 80;
server_name localhost;
root /data/www/demo-80;
index index.html index.htm;
...
}

一样能够实现我们的 WEB 访问。

这并不意味着 location 没有,相反的,location 在 nginx 中非常重要,在一些复制的处理逻辑中,我们都需用到 location 匹配来实现。

先来看看 location 的语法:

location [=|~|~*|^~] /uri/ {...}

当然这里的参数肯定不止这些,可以参考下表中常用的:

参数 说明
= 精确匹配,优先级最高
^~ uri 以某个字符串开头,nginx 不会对 uri 编码,所以 /static/ /aa 能够匹配 /static/20%/aa
~ 区分大小写的正则匹配
~* 不区分大小写的正则匹配
!~ 区分大小写的正则匹配取反
!~* 不区分大小写的正则匹配取反
/ 通用匹配,能匹配到所有

其优先级为:= > ^~ > 正则 > / 

我们在 vhosts 目录下新建一个 location-demo.conf 配置文件进行测试:

server {
listen 8081;
server_name localhost; location / {
echo "URI: /";
} location = / {
echo "URI: = /";
} location = /hello {
echo "URI: /hello";
} location ~ \.(jpg|png|gif|js|css) {
echo "URI: STATIC FILES";
} location ~* \.(jpg|png|gif|js|css) {
echo "URI: OTHER STATIC FILES";
} location ^~ /static {
echo "URI: /static";
} location ^~ /static/ {
echo "URI: /static/";
}
}

我们在另外一台机器上访问测试:

于是我们可以得出一些结论:

1. 在默认访问一个没有 URI 的 URL,无论有没有 /,系统默认是当作 / 处理的,所以 1,2 我们都匹配 = / 的规则。

2. 在使用 = 匹配时,虽优先级最高,但 uri 也限定死了,和 3,4 一样,后面加不加 / 两个结果。如 后面加啥都不再满足该规则。

3. 在区分大小写和不区分大小写同时存在的时候,率先匹配更精确的区分大小写,然后才是不区分大小写,如:6,7,8。

4. 在匹配开头的时候,从开头开始,满足的越多,匹配的优先级越多,如:9,10。

5. 在前后都满足匹配的时候,默认从左往右匹配,如果左边匹配了就直接满足左边,如:11,12,13。

最后总结下:

1. = 优先级最高,但是必须精确。

2. 正则匹配需要从左往右匹配着走,如果左边已经满足,那么满足越多的优先级越高。

3. 区分大小写的优先级高于不区分大小写。

附带一个常用的静态文件处理规则:

location ~* .*\.(js|css|png|jpg|gif|jpeg|bmp|ico)?$
{
# 7天过期,不保存日志
expires 7d;
access_log off;
} location ~* .*\.(zip|rar|exe|msi|iso|gho|mp3|rmvb|mp4|wma|wmv|rm)?$
{
# 禁止这些文件下载
deny all;
}

root / alias

在之前的静态 WEB 服务中,我们使用 root 来指定了我们 index.html 存放的路径。但是在 nginx 除了 root,我们还要另外一种,alias。

我们可以通过示例来进行区分:

1. 创建测试使用的网页:

mkdir /data/www/root
mkdir /data/www/alias
echo '<h1>ROOT WEB SERVER</h1>' > /data/www/root/index.html
echo '<h1>ALIAS WEB SERVER</h1>' > /data/www/alias/index.html

2. 在 vhosts 下面添加配置文件:root-alias.conf

server {
listen 8082;
server_name localhost; location ^~ /root {
root /data/www/root;
index index.html index.htm;
} location ^~ /alias {
alias /data/www/alias;
index index.html index.htm;
}
}

然后重载 nginx:

/data/services/nginx/sbin/nginx -s reload

此时我们访问查看 root 匹配:

访问查看 alias 匹配:

查看 error.log 查找 404 的原因:

可以看到最终请求的结果为:/data/www/root/root/index.html

这个目录是不存在的,由此我们可以得出:

root 指定路径会自动将后面的 uri 拼接上去。因为平时的 / 匹配,多以拼接后不影响,但是 uri 如果不为 / 就会出现问题,由此导致 404。

alias 在在指定路径的时候则不会拼接,无论你后面的 uri 是如何花里胡哨都不会影响我们本身的目录。

但是需要注意,alias 需要后面的 uri 必须以 / 开头,否则同样 404。

如果你没有用 / 开头,则会访问到 /data/services/nginx/html/alias 下面去,前面为 nginx 的默认 WEB 路径。

最后,如果我们以:http://192.168.100.111:8082/alias123 访问,会发现:

查找目录变成了我们 uri 后面的部分?其实不是,其实质是将 uri 满足匹配的部分去掉,然后将后面的 123 拼接到了 alias 指定的目录,由于指定的目录最后没有 / 才导致看起来一样,如果给他加上 / 则会变成 alias/123。感兴趣的可以去测试。

小结

root 在实际应用中用的多些,如果有特殊需求,alias 能帮到大忙。当然,location 才是重点。

【03】Nginx:location / root / alias的更多相关文章

  1. 【04】Nginx:rewrite / if / return / set 和变量

    写在前面的话 我们前面已经谈了编译安装,基本语法,日志处理,location 匹配,root / alias 的不同效果.这里我们主要谈谈 rewrite(重写)功能,顺便说说 nginx 中自带的变 ...

  2. 【转】nginx配置location总结及rewrite规则写法

    原文:http://seanlook.com/2015/05/17/nginx-location-rewrite/ 1. location正则写法 location = / { # 精确匹配 / ,主 ...

  3. nginx的location root alias指令以及区别

    原文:http://blog.csdn.net/bjash/article/details/8596538 location /img/ { alias /var/www/image/; } #若按照 ...

  4. nginx配置 location root alias

    语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...

  5. 【10】Nginx:后面有无 / 的区别

    写在前面的话 在 nginx 中,我们很多时候都有一个疑问,在 proxy_pass 或者 root 或者 location 后面需不需要加上 /,加和不加有啥区别. root  / alias 后面 ...

  6. 【08】Nginx:安全优化 / 信息隐藏 / 请求限制 / 白名单

    写在前面的话 nginx 中主要的内容在前面的章节其实已经差不多了,接下都是一些小功能的实现以及关于 nginx 的优化问题.我们一起来探讨以下,如何把我们的 nginx 打造成为企业级应用. 安全优 ...

  7. 【09】Nginx:静态压缩 / 日志切割 / 防盗链 /恶意解析/ 跨域

    写在前面的话 上一节我们谈了关于 nginx 服务器的一些简单的安全优化问题,能够帮助我们解决一部分线上服务存在的安全隐患.但是想要提升用户体验这是原因不够的,我们还需要从服务的优化方面入手. 本节更 ...

  8. 【05】Nginx:TCP / 正向 / 反向代理 / 负载均衡

    写在前面的话 在我们日常的工作中,不可能所有的服务都是简单的 HTML 静态网页,nginx 作为轻量级的 WEB 服务器,其实我们将它用于更多的地方还是作为我们网站的入口.不管你是后端接口,还是前端 ...

  9. 【02】Nginx:基本配置和日志处理

    写在前面的话 Nginx 在安装完成后自动为我们生成了一个展示欢迎页的虚拟主机,除此之外,还附带了很多基础的配置,我们先来看看这些配置有什么用,顺便添加一些常用但是配置文件中并未初始化进去的配置来专门 ...

随机推荐

  1. DevExpress 使用 GridControl 时,数据源无法立即更新的问题

    背景 在使用 DevExpress 的 GridControl 为其实现 Checkbox 列,发现如果勾选了三行的数据,在遍历 GridControl 绑定的数据源时 Checkbox 列的数据仅有 ...

  2. nikto---基本使用

    目录 一:基本使用 二:调节扫描过程 三:命令行选项 四:配置文件 注意:使用版本:Nikto v2.1.6 功能:Web服务器评估工具,目的在于查找任何类型的Web服务器的各种默认和不安全的文件,配 ...

  3. CAD绘图大师都在用的46组快捷键,高效绘图必备

    学习CAD 是一个需要慢慢积累的过程,千万不要遇到一点小困难就退缩,有困难我们就一起克服它!今天小编也是来帮助大家克服困难的!很多小伙伴学习CAD已经有一段时间了,但是发现自己的绘图效率还是不高,没关 ...

  4. 微信小程序和支付宝小程序富文本使用

    微信小程序使用的是 1. wxml 页面元素的最简单使用 <rich-text nodes="{{这是你的数据}}"></rich-text>   2. j ...

  5. [UIApplication sharedApplication].keyWindow.rootViewController

    一般来说 [UIApplication sharedApplication].keyWindow.rootViewController 会在 appDelegate 中初始化,并且整个应用运行过程中都 ...

  6. MAC TXT文本

    Mac系统下.txt格式的纯文本怎么保存? 作者:佚名 字体:[增加 减小] 来源:互联网 时间:06-02 14:29:23 我要评论 Mac系统下.txt格式的纯文本怎么保存?.txt是个用途广泛 ...

  7. Flask 异步化

    web网站包含前端和后端, 异步处理可以用在前端, 也可以用在后端.  前端 jquery 进行 ajax 请求时, 可设置 async 属性为 true, 并为 success 设置一个 callb ...

  8. 我写了个项目,帮你学习HTTP接口测试!

    端午节我写了一个项目,帮助你学习HTTP接口测试. GitHub地址: https://github.com/defnngj/learning-API-test 整个项目基于Flask和 Reques ...

  9. Pycharm创建Django项目

    1. 点击菜单栏的File--->New Project 2. 打开Terminal, 进入刚刚创建的路径执行如下命令: python manage.py startapp app01 显示效果 ...

  10. Houdini设置

    关闭网络编辑器动画 Animate network changes 平移时保持视口枢轴 Maintain Viewport Pivot when Panning 通知帮助提示将出现在Houdini的状 ...