前面的话

在实际应用中,权限控制的需求更加复杂。例如,对于网站下的 img 目录允许所有用

户访问,但对于网站下的 admin 目录则仅允许管理员身份的用户访问。此时,仅靠 deny

和 allow 这两个权限指令不能满足用户的需求,还需要使用 location 块来完成相 关需求的

匹配。

首先要简单了解 location 的相关语法及规定,具体如下。

nginx 权重分流算法 nginx权限控制_正则

location 前缀说明

nginx 权重分流算法 nginx权限控制_linux_02


根据表的描述,可将 location 根据不同前缀的使用方式,大致分为普通 location与正则 location 其中,~ 和~* 属于正则 location ,其余的前缀和没有前缀的情况都属于普location

接下来,通过 location 块和权限控制指令,逐一演示访问控制的几种典型使用方式。1. 精准匹配

所谓精准匹配指的就是用户访问的 URI 与指定的 URI 完全一致的情况,才会执行其

后的指令块,示例配置如下

nginx 权重分流算法 nginx权限控制_运维_03


nginx 权重分流算法 nginx权限控制_运维_04


上述第 6~8 行和第 9~11 行配置设置了两个精准匹配,第 12 行用于禁止所有用户的访问 。当上述配置中允许访问的两个客户端,请求网站根目录下不存在的文件或目录时,如果符合匹配规则,网页显示 404 Not Found ,不符合时显示 403 Forbidden。

假设网站根目录下没有任何文件,下面使用 IP 192. 168. 78. 128 用户和 IP

192. 168. 78 . 200 用户通过不同的 URL 进行访问测试,其对应的响应结果如下表 所示

nginx 权重分流算法 nginx权限控制_linux_05


从上表可以看出,精准匹配是只有用户请求的 URI location 中定义的匹配模式完全一致的情况下,才会执行其后的指令块,否则匹配不成功2. 正则匹配

Nginx 配置文件中,多个正则 location 之间按照正则 location 在配置文件中的书写顺序进行匹配,且只要匹配成功就不会继续匹配后面定义的正则 location. 下面在 IP192. 168. 78. 的虚拟机中,设置以下两个正则 location 访问控制,具体如下

nginx 权重分流算法 nginx权限控制_正则_06


在上述配置中,第 1行表示匹配网站根目录下以. html 结尾的文件,第 4行表示匹配网站根目录下 aaa 目录中以. html 结尾的文件。

下面使用 192. 168. 78. 128 的用户通过不同的 URL 进行访问测试, 其对应的响应结果如表所示

nginx 权重分流算法 nginx权限控制_linux_07


从上表 可以看出,当 location 中的 URI 与用户请求中以 html 为结尾的文件匹配上时,正则 location 停止了继续匹配,因此显示结果都为 404 Not Found

接下来,调换第1~3 行与第 4~6行代码的编写顺序,再次访问 http: // 192 168. 78 . 3/test. html 结果依然为 404 Not Found ,而访问 ttp // 192 168. 78 . 3/ aaa/ test. html 的结果

403 Forbidden。

从上述两组测试对比可总结出,正则 location 的编写顺序不同,则结果不同,且只有前

面定义的正则 location 匹配不成功的情况下,才会继续匹配后面的正则 location 。因此,读

者在实际应用中要注意正则 location 在配置文件中的书写顺序。

  1. 最大前缀匹配
    由于 location 可以同时定义多个,当 一个配置文件中同时出现多个 location 时,普通location 之间遵循“最大前缀匹配”原则 通俗地讲就是,匹配度最高的 location 将会执行
    示例如下

    下面利用不同的 URL 进行访问测试,对应的响应结果如下表所示。

值得 提的是,当最大前缀 location 与正则 location 同时存在时,如果正则location

配成功,则不会执行最大前缀 location 。具体示例如下。

nginx 权重分流算法 nginx权限控制_nginx_08


上述配置中,第1~3 行定义的是最大前缀 location ,用于匹配当前网站根目录下的所有文件,第4~6行用于正则匹配所有以 html 结尾的 UR 不同 及其对应的响应结果,如下表所示

nginx 权重分流算法 nginx权限控制_nginx_09


从上表可以看出,当用户访问 http //192. 168. 78. 时,完成第1 行的匹配;而在用户访问 http: //192. 168. 78. 3/notfound. html 和 http //192. 168. 78. 3/ index. php 时,前者符合正则 location ,结果为 404 Not Found ,而后者不符合正则 location ,显示了最大前缀匹配的结果 403 Forbidden。注意:

location /{} 与 location = /{} 的区别

nginx 权重分流算法 nginx权限控制_nginx 权重分流算法_10


4. 用正则匹配

利用 =精准匹配或 ^~非正则匹配可以在正则匹配之前优先匹配,从而禁止执行原有

的正则匹配 下面在 server 块中添加以下几条 location 匹配规则,具体如下

nginx 权重分流算法 nginx权限控制_nginx 权重分流算法_11


在上述配置中,第 1行仅用于精准匹配网站根目录下的 aaa/ test. html ,第 4行用于非正则匹配网站根目录下的文件,第7 行用于正则匹配网站根目录下以. html 为结尾的文件, 接下来通过不同 URL 进行访问测试,具体如下表所示。从表中的响应结果可以看出,在使用了“=”或“^~“前缀时,普通 location 匹配后将不再执行正则 location 的匹配,值得一提 的是,前缀“=”和 “^~”虽然都能阻止继续搜索正则 location ,不同的地方是

它们遵循的规则不同,“~”依然遵循最大前缀匹配规则,而=则严格按照精准匹配执行

因此,当多种类型的 location 匹配同时出现时,最终执行结果为“=”匹配优先于“^~”

匹配,“^~”匹配优先于正则匹配,正则匹配优先于普通的最大前缀匹配 只要优先的

location 匹配成功,就不会执行其他的 location

nginx 权重分流算法 nginx权限控制_linux_12

附录: root 与alias 的区别

nginx 权重分流算法 nginx权限控制_运维_13