前言
nginx的知识点有很多
- server : 用于定义服务,http中可以有多个server块
- listen : 指定服务器侦听请求的IP地址和端口
- server_name : 服务名称,用于配置域名
- location : 用于配置映射路径uri对应的配置
- root : 根路径
- index : 设置首页
- return:返回http状态码 和 可选的第二个参数可以是重定向的URL
- rewrite:重写URI请求 rewrite,通过使用rewrite指令在请求处理期间多次修改请求URI
- error_page:缺省页
- deny:禁止访问某个目录
- 内置变量:nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量
- 当然远远不止以上几点...
我们今天着重讨论location
nginx.conf配置:location不带/
首先,通过nginx.conf的设置,我们在8080端口开启了一个服务,以下的一些配置项我简单介绍一下
location:映射路径,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码alias:虚拟目录,alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的,我设置成我电脑目录的一个文件夹index:首页,我设置成这个alias里的index.html
server {
listen 8080;
server_name localhost;
add_header Cache-Control: no-cache;
location /homepage {
alias "/usr/local/Cellar/nginx/1.19.7/html/html/";
index index.html;
}
error_page 404 /404.html;
error_page 500 502 503 504 /404.html;
location = /404.html {
root html;
}
}
静态资源目录配置
以下是上述alias指定的/usr/local/Cellar/nginx/1.19.7/html/html目录结构
.
├── html # 放置html文件的文件夹
├── scripts # 放置js文件的文件夹
├── styles # 放置css文件的文件夹
├── 404.html # 404专用html文件
在终端中开启nginx
nginx
可以看到8080端口正常开启了服务
访问URL
首先,我们访问的URL为http://localhost:8080/homepage/
从下图可以看到,我们的请求为200,说明nginx成功找到了该文件并返回给客户端
接着,我们访问的URL为http://localhost:8080/homepage
从下图中可以看到,我们的请求被301了,301的地址可以从响应头的Location里得知,被301到了http://localhost:8080/homepage/,然后该请求则跟上文一致200并返回html
nginx.conf配置:location带/
我们现在修改location
server {
listen 8080;
server_name localhost;
add_header Cache-Control: no-cache;
- location /homepage {
+ location /homepage/ {
alias "/usr/local/Cellar/nginx/1.19.7/html/html/";
index index.html;
expires off;
}
error_page 404 /404.html;
error_page 500 502 503 504 /404.html;
location = /404.html {
root html;
}
}
修改完成后,让nginx重启,应用新的配置
nginx -s reload
接着访问URL
首先,我们访问的URL为http://localhost:8080/homepage
在下图中,我们可以看到请求404了
接着,我们访问的URL为http://localhost:8080/homepage/
在下图中,我们可以看到,与未加/对比,并没有什么不同
location URI结尾带不带 /
关于 URI 尾部的 / 有三点也需要说明一下。第一点与 location 配置有关,其他两点无关。
- location 中的字符有没有
/都没有影响。也就是说/homepage/和/homepage是一样的。 - 如果 URI 结构是
https://domain.com/的形式,尾部有没有/都不会造成重定向。因为浏览器在发起请求的时候,默认加上了/。虽然很多浏览器在地址栏里也不会显示/。 - 如果 URI 的结构是
https://domain.com/homepage/。尾部如果缺少/将导致重定向。因为根据约定,URL 尾部的/表示目录,没有/表示文件。所以访问/homepage/时,服务器会自动去该目录下找对应的默认文件。如果访问/homepage的话,服务器会先去找homepage文件,找不到的话会将homepage当成目录,重定向到/homepage/,去该目录下找默认文件。
location优先级
location的优先级与location配置的位置无关
- 正则匹配 location ~ /index { }
- 不区分大小写的正则匹配 location ~* /index { }
- 匹配路径的前缀,如果找到停止搜索 location ^~ /index { }
- 精确匹配 location = /index { }
- 普通路径前缀匹配 location /index { }
- 优先级: 4 > 3 > 2 > 1 > 5
location = / {
# 精确匹配/,主机名后面不能带任何字符串 /
[ configuration A ]
}
location / {
# 匹配所有以 / 开头的请求。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration B ]
}
location /documents/ {
# 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration C ]
}
location ^~ /images/ {
# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
# 所以,即便有符合的正则表达式location,也不会被使用
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif jpg jpeg结尾的请求。
# 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,还会继续往下搜索
[ configuration F ]
}
location = /test.htm {
root /usr/local/var/www/htm;
index index.htm;
}