详解nginx的root与alias

文章目录

  • 1. 结论
  • 2. 详解root
    • 2.1 基本用法
    • 2.2 location的最左匹配原则
    • 2.3 index
    • 2.4 nginx location解析url工作流程
    • 2.5 末尾'/'
  • 3. 详解alias
    • 3.1 基本用法
  • 4. 特殊情况
    • 4.1 alias指定文件
    • 4.2 root指定文件

nginx版本: 1.18.0

1. 结论

location命中后

如果是root,会把请求url的 ip/域名+port替换为root指定的目录,访问资源

如果是alias,会把请求url的ip/域名+port+匹配到的路径替换为alias指定的目录,访问资源

2. 详解root

2.1 基本用法

以请求http://example.com/foo/bar/hello.html 为例,location配置如下

location /foo {root /home/hfy/;
}

匹配到/foo,url的域名+port替换为root指定的目录,即url中的examp.com被替换为了/home/hfy,所以实际访问的路径为/home/hfy/foo/bar/hello.html

为了更好理解,再来一个例子,请求的url不变,location配置更改为

location /foo/bar {root /home/hfy/;
}

匹配到/foo/bar,url的域名+port替换为root指定的目录,即url中的examp.com被替换为了/home/hfy,所以实际访问的路径仍然为/home/hfy/foo/bar/hello.htmlroot在替换时不会替换匹配到的路径

2.2 location的最左匹配原则

location会从url最左边的路径匹配,如果一致则命中该location。只有中间匹配到不会命中。
比如请求的url为http://example.com/foo/bar/hello.html ,location为

location /bar {root /home/hfy/;
}

不会命中该location,因为从url中的/foo开始匹配,与location /bar不一致,不会命中,如果url更改为http://example.com/bar/hello.html 才会命中该规则

2.3 index

在location内部其实默认配置了一条规则index index.html,补全后的规则如下

location /foo {root /home/hfy/;index index.html;
}

假设我们访问的url为http://example.com/foo/bar ,匹配到/foo,实际访问的路径为/home/hfy/foo/bar。如果我们的bar是一个文件夹,其中如果包含index.html文件,则会把该文件返回。所以index的作用是,当实际访问的是一个目录时,会返回该目录中index指定的文件,如果该目录中不存在index指定的文件,则会返回403。

在访问http://example.com/foo/bar ,时我们打开浏览器的控制台,查看发送的请求,会发现发生了一个301重定向,http://example.com/foo/bar 被重定向为http://example.com/foo/bar/ ,由此引发了新的问题,为什么会发生重定向,url末尾的/,location 匹配路径末尾的/,以及root 指定目录末尾的/都表示什么意思

2.4 nginx location解析url工作流程

经过我的多次测试,发现解析url工作流程图如下
请添加图片描述

上述的工作流程,假设了url末尾没有加/,如果末尾包含/,解析流程为上图中绿色部分。例如url为http://example.com/foo/ ,如果foo不存在或者是文件,则直接返回404,如果是foo是目录,则进入到绿色部分流程。如果foo目录中存在index指定的文件,则返回该文件。如果不存在返回403。从这个例子可以看出,url末尾加/表示要访问一个目录,如果实际是个文件,nginx会返回404

根据上述的流程图,我们看一下2.3中的重定向问题,在访问http://example.com/foo/bar 为什么发生了301重定向。

首先命中如下规则

location /foo {root /home/hfy/;index index.html;
}

根据上述的流程图,先替换域名+port,实际访问的路径为/home/hfy/foo/bar,然后nginx发现bar不是文件而是个目录(文件夹),所以重定向为了http://example.com/foo/bar/ 访问bar这个目录中的index.html文件

2.5 末尾’/’

然后再看一下2.3中的另一个问题,末尾的/分别是什么含义
事先声明,仅是我个人粗浅的理解,根据对不同情况的测试,尝试总结 '/'的含义

  • url末尾/的含义

http://example.com/foo/bar 表示我们把bar当成一个文件,想要访问bar文件
http://example.com/foo/bar/ 表示我们把bar当成一个目录,想要访问bar目录下index指定的文件

  • location 匹配路径末尾/的含义
location /foo {root /home/hfy/;index index.html;
}

/foo 既能匹配http://example.com/foo 也能匹配 http://example.com/foo/

location /foo/ {root /home/hfy/;index index.html;
}

/foo/只能匹配http://example.com/foo/

  • root 指定目录末尾/的含义
location /foo {root /home/hfy/;index index.html;
}

/home/hfy 表示把hfy当成目录或者文件

/home/hfy/ 表示只把hfy当成目录

root后面指定的都应该是目录 (不过alias有种特殊情况,后面会提到)

对于这三个斜杠,在实践中可以有如下使用方案

  1. url末尾不加/,如果需要带/时依靠nginx自动帮我们重定向加/
  2. location 路径不加/,这样末尾有无/的url都能匹配到
  3. root或者alias指定的目录后面加/,明确表示root指定的是目录,增强配置的可读性

3. 详解alias

3.1 基本用法

以请求http://example.com/foo/bar/hello.html为例,location配置如下

location /foo {alias /home/hfy/;
}

匹配到/foo,url的ip/域名+port+匹配到的路径替换为alias指定的目录,即url中的example.com/foo被替换为了/home/hfy,所以实际访问的路径为/home/hfy/bar/hello.html

同样再来一个例子,请求的url不变,如果location配置更改为

location /foo/bar {alias /home/hfy/;
}

匹配到/foo/bar,url的ip/域名+port+匹配到的路径替换为alias指定的目录,即url中的example.com/foo/bar被替换为了/home/hfy,所以实际访问的路径为/home/hfy/hello.htmlalias在替换时会替换匹配到的路径

alias其余特性,最左匹配、index、location解析url工作流程、末尾’/'与root一致。

4. 特殊情况

4.1 alias指定文件

  • case 1

url http://example.com/foo

/home/hfy/foo是一个文件

location配置如下

location /foo {alias /home/hfy/foo;
}

实际访问路径/home/hfy/foo,nginx返回foo文件

这就是上面说的特例,alias也可以指定文件,并且正常返回了要访问的文件。但是实际一般不会用alias指定文件。

  • case 2

url http://example.com/foo

/home/hfy/foo是一个文件

location配置如下

location /foo {alias /home/hfy/foo/;
}

实际访问路径/home/hfy/foo,alias指定 /home/hfy/foo/是一个目录,而foo是一个文件,返回404

  • case 3
    url http://example.com/foo/

/home/hfy/foo是一个文件

location配置如下

location /foo/ {alias /home/hfy/foo;
}

实际访问路径/home/hfy/foo/要访问目录,alias指定/home/hfy/foo是目录或文件,而foo是一个文件,返回了500

  • case 4

url http://example.com/foo/

/home/hfy/foo是一个文件

location配置如下

location /foo/ {alias /home/hfy/foo/;
}

实际访问路径/home/hfy/foo/,alias指定/home/hfy/foo/是一个目录,而foo是一个文件,返回了404

  • case 5

url http://example.com/

/home/hfy/foo是一个文件

location配置如下

location / {alias /home/hfy/foo;
}

实际访问路径/home/hfy/foo,但是返回了500

  • case 6

url http://example.com/

/home/hfy/foo是一个文件

location配置如下

location / {alias /home/hfy/foo/;
}

实际访问路径/home/hfy/foo,返回404

4.2 root指定文件

  • case 1

url http://example.com/foo

/home/hfy/foo是一个文件

location配置如下

location /foo {root /home/hfy/foo;
}

实际访问路径/home/hfy/foo/foo,不存在,返回404

  • case 2

url http://example.com/foo

/home/hfy/foo是一个文件

location配置如下

location /foo {root /home/hfy/;
}

实际访问路径/home/hfy/foo,返回foo文件

  • case 3

url http://example.com/foo/

/home/hfy/foo是一个文件

location配置如下

location /foo {root /home/hfy/;
}

location配置如下

location /foo/ {root /home/hfy/;
}

实际访问路径/home/hfy/foo/要访问目录,/home/hfy/foo是文件,返回404

  • case 4

url http://example.com/

/home/hfy/foo是一个文件

location配置如下

location / {root /home/hfy/foo;
}

实际访问路径/home/hfy/foo,foo是一个文件,但是却返回404

  • case 5

url http://example.com/

/home/hfy/foo是一个文件

location配置如下

location / {root /home/hfy/foo/;
}

实际访问路径/home/hfy/foo,foo是一个文件,但是却返回404

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619671.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux命令之alias

在Linux中,alias命令的功能是设置命令的别名,用以简写命令,提高操作效率。根据参数的不同,该命令可查看已设定的别名,或为命令设置新的别名。对于用户自定义别名,仅当前登录期内有效;也可修改配…

Linux之alias命令

回复【1001】获取 linux常用命令速查手册 Linux alias命令用来设置指令的别名,对一些较长的命令进行简化。使用alias时,必须使用单引号将原来的命令包含,防止特殊字符导致错误。 命令格式 alias [-p] [name[value] ...] 命令功能 简化较长…

别名机制alias详解——一个让你少敲键盘的偷懒方式

别名机制alias——让你少敲键盘的偷懒方式 目录 别名机制alias——让你少敲键盘的偷懒方式样例环境1.从一个例子开始:2.别名机制alias:2.1 什么是alias:2.2 alias怎么用:2.3 alias的注意事项: 参考文献: 样…

Linux基础——别名(alias)

一、啥是别名? 别名(alias)是某个命令或者某一组命令的代称,和我们的小名或者外号一样,比如一些少数民族或者复姓的同学名字可能比较长,那我们一般不会每次都喊全名,而是用一个能特指他的另外一个名字称呼…

Linux——alias命令(设置命令别名)

Linux——alias命令(设置命令别名) alias 是shell内建命令(即shell中自带的命令),它可以将常用的命令以及它的参数创建一个别名,来减少命令的输入量 我们常用的一些命令就是别名 eg:ls 、ll 1…

GIthub 无法访问使用Watt Toolkit加速

一、使用 Watt Toolkit Watt Toolkit 是一款加速软件,原名是 Steam,后来改名为 Watt Toolkit,其可以让原本无法访问的 Steam 游戏社区、 GitHub 、谷歌验证码等国内难以访问的网页正常访问。 三种下载方式: Watt Toolkit 官网下…

【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制

【JavaEE】Spring事务(2) 文章目录 【JavaEE】Spring事务(2)1. Transactional 参数介绍1.1 value 和 transactionManager1.2 timeout1.3 readOnly1.4 后面四个1.5 isolation 与 propagation 2. Spring 事务隔离级别 - isolation2.…

房屋中介费怎么收取才合理?快看看别再花冤枉钱了

[摘要]本文讲述了什么是房屋中介,房屋中介费是如何收取的,房屋中介费的收取标准是什么。希望可以对即将用到房屋中介的网友们有所帮助。 买房的朋友都应该知道有房产中介这回事,甚至有的是通过房产中介的服务来买的房,当然&#x…

基于C#的房屋租赁管理系统设计与实现

目录 第一章 引言 3 第二章 系统分析与设计 4 2.1 需求分析 4 设计流程图: 4 2.2数据库概念结构设计 5 E-R图 5 2.3数据库的创建 6 管理员表: 6 房屋表: 7 用户信息表: 7 房屋租贷表: 7 财务报表: 7 收费标…

设计模式.中介者模式Mediator

定义 中介者模式(Mediator pattern) : 使用中介者模式来集中相关对象之间复杂的沟通和控制方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作…

C++课程设计 房产中介管理系统(代码全)

目录表 1 需求分析**主函数:调用创建的各种类和方法**交易类:交易的实现房屋类:主要管理房屋信息房主信息:管理房屋主人的信息房主的实现:看房信息:存储有人想去实地看房的信息,预约等看房信息的…

房屋中介费收取标准有?详细的房屋中介费收取标准。

[摘要]如果购房者在买房的一定过程中,你选择找了中介,对购房会有便利的一方面,但是房屋中介费收取标准是什么呢?你了解房屋中介费收取标准吗?来了解房屋中介费收取标准吧。如果你选择了中介公司,可以参考条…

基于Linux操作系统的keepalived双机热备和keepalived+lvs(DR)基本配置操作

目录 keepalived双机热备 一、概述 (一)具体工作原理如下: (二)实验拓补 二、安装NFS、配置 1、第一台机器配置:NFS :192.168.11.101 2、更改配置文件 3、安装NFS进行目录共享 4、编辑…

应不应该收取房屋中介费用?房屋中介费用收取合理吗

[摘要]近年来不少人选择通过中介机构完成房屋买卖,那房屋中介费用是怎么收取的?房屋中介费用收取的标准是什么?交了房屋中介费用就可以安枕无忧了吗?但实际中,有一些中介机构的服务质量和效果良莠不齐,购房的情况也是千变万化,导致纠纷不断。 近年来不少人选择通过中介机构完…

基于NodeJS+VUE房屋中介管理系统的设计与实现

当今社会房屋租赁买卖是必不可少的,人们不管走到哪里都需要有一个温馨的家,有一个落脚之地,所以房屋租赁市场也是非常火爆!不管是房屋中介公司或者是个人都需要一套完整的管理系统来掌握整个市场信息。针对这一需求,本…

【全源码及文档】基于Java面向对象开发的房屋中介管理系统

摘 要 现代的房产市场愈加复杂化,用软件来管理房产中介管理系统的开发与设计及自动匹配等功能,在实际运用中起到极大的帮助作用。 随着房地产业的飞速发展,待交易房屋的数量大幅度提高,传统手工处理为主的房屋管理方式存在着工作…

[附源码]计算机毕业设计JAVA房屋中介管理系统

[附源码]计算机毕业设计JAVA房屋中介管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

[附源码]java毕业设计房屋中介管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【河北建筑工程学院毕业论文】房屋中介公司网站的设计与实现

摘 要 随着计算机行业的不断发展,计算机的应用也随着行业发展的速度而不断更新。如今,在网络应用非常广泛的社会中,房屋中介公司的网站功能要求更加严格,所以一个好的系统对于房屋中介公司的网站来说非常重要。 本文详细介绍了房…

帝国CMS仿管理资源吧资料下载网站模板源码/下载会员+积分付费下载功能自动采集资源网站源码

帝国CMS仿管理资源吧资料下载网站模板源码,带下载会员积分付费下载功能自动采集资源网站源码,管理资源吧——为中小企业管理者提供全方位的管理资料下载服务;是一个所有资料免费下载,免注册、免登陆、免积分的公益性的管理知识共享…