• Nginx中location模块的匹配优先级


    一、Nginx常见模块

    http

    http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这模块中。作用包括:文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。

    server

    server块,虚拟主机(虚拟服务器)。作用:使得Nginx服务器可以在同一台服务器上只要运行一组Nginx进程,就可以运行多个网站。

    location

    location块是server块的一个指令。作用:基于Nginx服务器接收到的请求字符串,虚拟主机名称(ip,域名)、url匹配,对特定请求进行处理。

    在http模块中有server,server模块中有location,location匹配的是uri,例如/test、/image

    二、Nginx中常用正则表达式

    ^字符串的起始位置
    $字符串的结尾位置
    *匹配所有
    +匹配前面的字符至少一次
    ?匹配前面的字符0次或者1次
    .任意单个字符
    {n}连续重复出现n次
    {n,m}连续重复出现n-m次
    [a-z0-9A-Z]范围匹配,匹配0-9和a-z以及A-Z
    [c]匹配单个字符c
    ()分组
    |

    三、Location

    3.1 location匹配方式

    1、精确匹配

    location = /{...}

    要完整的路径,一个字不能少,也不能错

    2、正则匹配

    location ~ / {...}

    location ^~:前缀匹配,以什么为开头

    location ~:区分大小写进行匹配

    location ~*:不区分大小写进行匹配

    location !~:区分大小写取反匹配

    location !~*:不区分大小写取反匹配

    3、一般匹配

    location / {...}

    注意:location匹配一旦匹配成功,便不再向下继续匹配

    3.2 location匹配的优先级

    精确匹配优先级>正则匹配>一般匹配

    实验:往三个目录中传入内容不同但是在各自目录都叫1.jpg的图片,查看location会匹配哪一个

    1. [root@nginx1 conf]# vim nginx.conf
    2. server {
    3. ...
    4. location = /1.jpg {
    5. root /data/nginx/static1;
    6. }
    7. location /1.jpg {
    8. root /data/nginx/static2;
    9. }
    10. location ~* \.(gif|jpg|jpeg)$ {
    11. root /data/nginx/static3;
    12. }
    13. ...
    14. }

    1. [root@nginx1 conf]# nginx -t
    2. [root@nginx1 conf]# systemctl restart nginx
    3. [root@nginx1 conf]# cd /
    4. [root@nginx1 /]# mkdir -p /data/nginx
    5. [root@nginx1 /]# cd /data/nginx
    6. [root@nginx1 nginx]# mkdir static1 static2 static3
    7. [root@nginx1 nginx]# cd static1
    8. --传入图片1--
    9. [root@nginx1 static1]# cd ..
    10. [root@nginx1 nginx]# cd static2
    11. --传入图片2并改名为1.jpg--
    12. [root@nginx1 nginx]# mv 2.jpg 1.jpg
    13. [root@nginx1 static2]# cd ..
    14. [root@nginx1 nginx]# cd static3
    15. --传入图片3并改名为1.jpg--
    16. [root@nginx1 static3]# mv 3.jpg 1.jpg

    浏览器访问20.0.0.61/1.jpg验证发现是static1中的图片

    将精准匹配的location模块注释掉,再次用浏览器访问20.0.0.61/1.jpg

    结果是正则匹配location模块指定的static3目录中的图片

    总结:

    (location=完整路径)>(location ^~ 路径)>(location~,~*正则顺序)>(location不分起始路径)>(location /)

    3.3 工作当中配置location的原则

    1、网站首页:都是精确匹配,网站首页一般都是一个静态页面,匹配网站的根工作目录
    即location = /{...}

    2、处理静态文件的请求:目录匹配和后缀匹配结合
    即location ^~ /static {...}
    location ~* \.{html|jpg|jpeg|gif|png}${...}

    3、一般规则:处理动态请求,把动态请求转发给后端的动态页面的服务器
    即location /{
    proxy_pass http://tomcat server;
    }

    四、rewrite

    4.1 rewrite简介

    结合nginx提供的全局变量和自定义的变量,再结合正则表达式以及标志位实现url重写以及重定向

    4.2 rewrite执行顺序

    1、先执行server块里面的rewrite
    2、执行location块里面定义的rewrite
    3、选定location中的rewrite
    (在rewrite中可以支持if语句,只有if,没有else)

    4.3 rewrite语法

    1. rewrite [flag];
    2. :正则表达式
    3. :跳转的内容或者路径
    4. [flag]:标志位
    5. -------------------------------------------------------------------------------------------
    6. 标志位:
    7. last:     本条规则匹配完成后,继续向下匹配新的location URI规则
    8. break:    本条规则匹配完之后立即终止,页面内容变化,但是uri不变
    9. redirect: 临时重定向,302,uri的地址会发生变化
    10. permanent:永久重定向,301,uri地址也会发生变化

    永久重定向实验

    1. [root@nginx1 conf]# vim nginx.conf
    2. ...
    3. server {
    4. listen 80;
    5. server_name localhost;
    6. location / {
    7. rewrite /test/(.*) /pup/$1 permanent;
    8. root html;
    9. index index.html index.htm;
    10. }
    11. -------------------------------------------------------------------------------------------
    12. rewrite /test/(.*) /pup/$1 permanent;
    13. 只要访问test就会跳转到pup
    14. .*:表示匹配所有
    15. $1:表示捕获组,引用正则表达式的第一个捕获组,即是.*的内容
    16. 例如:访问www.pup.com/test/index.html
    17. 即会跳转到www.pup.com/pup/index.html
    18. -------------------------------------------------------------------------------------------
    19. [root@nginx1 pup]# nginx -t
    20. [root@nginx1 pup]# systemctl restart nginx
    21. [root@nginx1 conf]# cd ..
    22. [root@nginx1 nginx]# cd html/
    23. [root@nginx1 html]# mkdir test pup
    24. [root@nginx1 html]# cd test/
    25. [root@nginx1 test]# echo 'this is test' > index.html
    26. [root@nginx1 test]# cd ..
    27. [root@nginx1 html]# cd pup/
    28. [root@nginx1 pup]# echo 'this is pup' > index.html

    浏览器访问20.0.0.61/test

    临时重定向实验

    1. [root@nginx1 conf]# vim nginx.conf
    2. server {
    3. listen 80;
    4. server_name localhost;
    5. location / {
    6. rewrite /test/(.*) /pup/$1 redirect;
    7. root html;
    8. index index.html index.htm;
    9. }
    10. [root@nginx1 conf]# nginx -t
    11. [root@nginx1 conf]# systemctl restart nginx

    浏览器访问20.0.0.61/test

    永久重定向和临时重定向的区别:

    影响搜索引擎的权重
    永久重定向会加入到搜索引擎的排名
    临时不会加入搜索引擎的权重

    break实验

    last实验

    1. [root@nginx1 conf]# vim nginx.conf
    2. server {
    3. listen 80;
    4. server_name localhost;
    5. location /test1 {
    6. rewrite /test1/(.*) /test2/$1 last;
    7. index index.html index.htm;
    8. }
    9. location /test2 {
    10. rewrite /test2/(.*) /test1/$1 last;
    11. index index.html index.htm;
    12. }
    13. [root@nginx1 conf]# nginx -t
    14. [root@nginx1 conf]# systemctl restart nginx
    15. [root@nginx1 conf]# cd ..
    16. [root@nginx1 nginx]# cd html
    17. [root@nginx1 html]# mkdir test1 test2
    18. [root@nginx1 html]# cd test1
    19. [root@nginx1 test1]# echo 123 > index.html
    20. [root@nginx1 test1]# cd ..
    21. [root@nginx1 html]# cd test2
    22. [root@nginx1 test2]# echo 456 > index.html

     浏览器访问20.0.0.61/test1

    解决方法:

    write和location的区别:
    rewrite是在同一域名之内更改获取资源的路径
    location是对路径访问控制

    4.4 rewrite实验 

    1、基于域名的访问跳转

    某公司旧域名为www.pup.com,但是公司业务变更,迁移到了新的域名:www.benet.com
    但是旧域名不能被废除,访问pup可以跳转到benet,且匹配的uri不变

    1. [root@nginx1 conf]# vim nginx.conf
    2. server {
    3. listen 80;
    4. server_name www.pup.com;
    5. location / {
    6. if ($host = 'www.pup.com') {
    7. rewrite ^/(.*)$ http://www.benet.com/$1 permanent;
    8. }
    9. root html;
    10. index index.html index.htm;
    11. }
    12. }
    13. [root@nginx1 conf]# nginx -t
    14. [root@nginx1 conf]# systemctl restart nginx
    15. [root@nginx1 conf]# cd ..
    16. [root@nginx1 nginx]# cd html/
    17. [root@nginx1 html]# echo 'this is pup' > index.html
    18. [root@nginx1 html]# echo '20.0.0.61 www.kgc.com www.benet.com' >> /etc/hosts

    2、基于ip的访问跳转

    某公司业务新版上线,用户访问网站统一显示固定的维护页面,只有20.0.0.61可以访问

    1. [root@nginx1 conf]# vim nginx.conf
    2. server {
    3. listen 80;
    4. server_name www.pup.com;
    5. set $rewrite true;
    6. if ($remote_addr = "20.0.0.61"){
    7. set $rewrite false;
    8. }
    9. if ($rewrite = true) {
    10. rewrite (.+) /error.html;
    11. }
    12. location = /error.html {
    13. root html;
    14. }
    15. location / {
    16. root html;
    17. index index.html index.htm;
    18. }
    19. [root@nginx1 conf]# nginx -t
    20. [root@nginx1 conf]# systemctl restart nginx
    21. [root@nginx1 conf]# cd ..
    22. [root@nginx1 nginx]# cd html/
    23. [root@nginx1 html]# echo "error!" > error.html

    20.0.0.61访问

    20.0.0.62访问

    3、基于目录下所有php结尾的文件跳转 

    1. [root@nginx1 conf]# vim nginx.conf
    2. server {
    3. listen 80;
    4. server_name www.pup.com;
    5. location ~* /upload/.*\.php$ {
    6. rewrite (.+) http://www.test.com permanent;
    7. }
    8. location / {
    9. root html;
    10. index index.html index.htm;
    11. }
    12. [root@nginx1 conf]# nginx -t
    13. [root@nginx1 conf]# systemctl restart nginx
    14. [root@nginx1 conf]# cd ..
    15. [root@nginx1 nginx]# cd html/
    16. [root@nginx1 html]# mkdir upload
    17. [root@nginx1 html]# cd upload/
    18. [root@nginx1 upload]# echo 123 > index.php
    19. [root@nginx1 upload]# vim /etc/hosts
    20. 20.0.0.61 www.test.com

    浏览器访问20.0.0.61/upload/index.php

  • 相关阅读:
    pytorch定义datase多次重复采样
    Spring Cloud Nacos实现动态配置加载的源码分析
    通过使用Amazon Neptune来预测电影类型初体验
    java计算机毕业设计铝塑门窗的研制和生产管理源码+系统+mysql数据库+lw文档
    面试经典150题——Day2
    科普初步了解大模型
    分享一个网上搜不到的「Redis」实现「聊天回合制」的方案
    golang 工程组件:grpc-gateway 环境安装+默认网关测试
    善网ESG周报(第三期)
    Unity读书系列《Unity3D游戏开发》——脚本(一)
  • 原文地址:https://blog.csdn.net/pupcarrot/article/details/133883127