【10】Nginx:后面有无 / 的区别
写在前面的话
在 nginx 中,我们很多时候都有一个疑问,在 proxy_pass 或者 root 或者 location 后面需不需要加上 /,加和不加有啥区别。
root / alias 后面的 /
root 和 alias 都是指向目录,所以后面是否存在 / 没有影响:
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;
}
}
我们这里加不加红色的 / 都一样的结果。
location 后面的 /
在 location 中也存在是否添加 / 的情况:
server {
listen 8082;
server_name localhost;
location ^~ /alias/ {
echo "WITH: /";
}
location ^~ /alias {
echo "WITHOUT: /";
}
}
此时两种匹配就有了两个含义,前者只能匹配 /alis/123 这样的,而后者可以匹配 /alias123,也可 /alias/123 这样的。
但是当两者同时在一个 server 中由于匹配精确度越高优先级越高的原因,后者匹配不到 /alias/123

proxy_pass 后面的 /
这个才是我们这次说明的重点,也是最为复杂的:

我们新建这样的目录结构,然后配置 nginx:
server {
listen 7000;
server_name localhost;
location / {
root /data/www/proxy_pass;
}
}
此时我们可以访问这 4 个 html 文件测试:

这个时候我们做反向代理:
# 代理不带项目名称,没有 /
server {
listen 7001;
server_name locahost; location /proxy/ {
proxy_pass http://127.0.0.1:7000;
}
} # 代理不带项目名称,但是有 /
server {
listen 7002;
server_name locahost; location /proxy/ {
proxy_pass http://127.0.0.1:7000/;
}
} # 代理带项目名称,没有 /
server {
listen 7003;
server_name locahost; location /proxy/ {
proxy_pass http://127.0.0.1:7000/other;
}
} # 代理带项目名称,但是有 /
server {
listen 7004;
server_name locahost; location /proxy/ {
proxy_pass http://127.0.0.1:7000/other/;
}
}
此时我们访问测试同一 URI 不同端口:

结论:
在 proxy_pass 中,当我们不是 / 匹配而是带有自定义项目名匹配的时候:
1. proxy_pass 后面带 /,我们的自定义的项目名就不会被视作路径的一部分去查找后端。
2. proxy_pass 后面不带 /,我们自定义的项目名会当成路径的一部分添加到代理后端的查找中。
当我们在 proxy_pass 代理的导致中还包含项目名称的时候:
1. 当后面还跟了项目名,我们自定义的匹配项目名就都不会再作为请求的一部分去查找后端。
2. 当后面的项目名不带 / 的时候,除去我们自定义部分,后面的 URI 会直接拼接到我们 proxy_pass 上面,由于他们之间没有 / 分隔,所以会组成一个新的路径去查后端。
3. 当后面的项目带 / 的时候,则会在拼接的时候相当于多了个 / 的分隔。
小结
这个 / 就很小的一个符号,但是可能造成我们配置的东西完全不符合我们的需求,特别是第三个 proxy_pass 的。
【10】Nginx:后面有无 / 的区别的更多相关文章
- nginx里proxy_pass有无/的区别
nginx在反向代理的时候,proxy_pass需要指定路径,有无"/"的区别,如下: location /lile { 配置一: proxy_pass http://192. ...
- nginx 和uwsgi的区别与作用
在介绍nginx和uwsgi的区别和作用之前我们先介绍一下几个概念 1.WSGI WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器.pyt ...
- apache与nginx日志文件的区别(转载)
apache与nginx日志文件的区别 转载:http://www.xfcodes.com/apache/log/3270.htm 导读:apache与nginx日志文件的区别,在apache与ngi ...
- 简析 Tomcat 、Nginx 与 Apache 的区别
简析 Tomcat .Nginx 与 Apache 的区别 本文讲的是简析 Tomcat .Nginx 与Apache的区别, 经常在用 apache 和 tomcat 等这些服务器,可是总感觉还是不 ...
- nginx和uwsgi的区别和作用
Django+uwsgi+nginx nginx和uwsgi的区别和作用: 1, nginx是对外的服务器,外部浏览器通过url访问nginx, uwsgi是对内的服务器,主要用来处理动态请求. 2, ...
- nginx与apache的区别
Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务. 应用层使用HTTP协议. HTML文档格式. 浏览器统一资源定位器(URL). Web服 ...
- web服务器之nginx和apache的区别
① apache属于重量级的服务器,nginx属于轻量级的服务器; 区别在于对一些功能的支持,比如: pathinfo,php模块方面 ② nginx抗高并发能力强. 由于nginx采用的是异步非阻 ...
- tomcat 与 nginx,apache的区别
tomcat 与 nginx,apache的有什么区别 回答一: 题主说的Apache,指的应该是Apache软件基金会下的一个项目——Apache HTTP Server Project:Nginx ...
- oracle和sql server中,取前10条数据语法的区别
在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...
随机推荐
- MyCat启动失败 Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: rebirth.a: rebirth.a: unknown error
在使用Nactive连接MyCat的时候发现怎么连接都不ok,明明已经启动了(实际上启动失败了)! 粗心的我,后来看了下日志,果然,启动失败了 Error: Exception thrown by t ...
- MySQL学习——操作视图
MySQL学习——操作视图 摘要:本文主要学习了使用DDL语句操作视图的方法. 了解视图 是什么 视图是从一个.多个表或者视图中导出的表,包含一系列带有名称的数据列和若干条数据行. 特点 视图不是数据 ...
- webpack代码分离CommonsChunkPlugin插件的使用(防止重复)
1.webpack.config.js中添加: const path = require('path'); + const webpack = require('webpack'); const HT ...
- Mysql—索引原理与详解
索引的原理 索引的优点和缺点和使用原则 索引优点: 可以加快数据的检索速度,提高查询速度. 所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段建立索引. 全文检索字段进行搜索优化. ...
- Windows 跟 Linux 文件共享:Samba 设置
用 Samba 服务器 https://my.oschina.net/u/3783115/blog/1919892?from=timeline https://blog.51cto.com/1372 ...
- 01 python的安装
下载3.7.0版本 然后点击 close 关闭 1-==>搜索输入“cmd”输入 “python -V”并回车. 出现版本说明安装成功.2==>>>> 是提示符3=== ...
- python session保持登录,新增地址,并删除,由观察可知,address_id决定删除的内容;
import requests,reheaders={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) Ap ...
- python函数加括号于不加括号的区别
一.不带括号时,调用的是这个函数本身 ,是整个函数体,是一个函数对象,不须等该函数执行完成二.带括号(参数或者无参),调用的是函数的执行结果,须等该函数执行完成的结果 def test(a): ret ...
- day49_9_10jQuery剩余
一.表单筛选器. 在jQuery中有,专门对表单中的元素,进行筛选的表单筛选器. 其实使用基本筛选器也可以筛选出相应的元素,但是,为了jQuery的简便性,以及对表单操作的频繁,这里可以使用专门的筛选 ...
- 解决问题:Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean. 注释掉, ...