写在前面的话

在 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:后面有无 / 的区别的更多相关文章

  1. nginx里proxy_pass有无/的区别

    nginx在反向代理的时候,proxy_pass需要指定路径,有无"/"的区别,如下:   location /lile { 配置一: proxy_pass http://192. ...

  2. nginx 和uwsgi的区别与作用

    在介绍nginx和uwsgi的区别和作用之前我们先介绍一下几个概念 1.WSGI WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器.pyt ...

  3. apache与nginx日志文件的区别(转载)

    apache与nginx日志文件的区别 转载:http://www.xfcodes.com/apache/log/3270.htm 导读:apache与nginx日志文件的区别,在apache与ngi ...

  4. 简析 Tomcat 、Nginx 与 Apache 的区别

    简析 Tomcat .Nginx 与 Apache 的区别 本文讲的是简析 Tomcat .Nginx 与Apache的区别, 经常在用 apache 和 tomcat 等这些服务器,可是总感觉还是不 ...

  5. nginx和uwsgi的区别和作用

    Django+uwsgi+nginx nginx和uwsgi的区别和作用: 1, nginx是对外的服务器,外部浏览器通过url访问nginx, uwsgi是对内的服务器,主要用来处理动态请求. 2, ...

  6. nginx与apache的区别

    Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务. 应用层使用HTTP协议. HTML文档格式. 浏览器统一资源定位器(URL). Web服 ...

  7. web服务器之nginx和apache的区别

    ① apache属于重量级的服务器,nginx属于轻量级的服务器; 区别在于对一些功能的支持,比如:  pathinfo,php模块方面 ② nginx抗高并发能力强. 由于nginx采用的是异步非阻 ...

  8. tomcat 与 nginx,apache的区别

    tomcat 与 nginx,apache的有什么区别 回答一: 题主说的Apache,指的应该是Apache软件基金会下的一个项目——Apache HTTP Server Project:Nginx ...

  9. oracle和sql server中,取前10条数据语法的区别

    在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...

随机推荐

  1. SpringCloud的入门学习之Eureka(Eureka的单节点)

    SpringCloud--->Spring生态体系的微服务架构:https://spring.io/ 官网贴图,如下所示,介绍了微服务的架构体系(话说,英语好读官网,可能很爽吧,没体验过). 1 ...

  2. 杂牌机搞机之旅最终章————刷入Xposed框架

    杂牌机搞机之旅最终章----刷入Xposed框架 recovery移植不成功,没办法,挂载分区好像挂载不上,所以,刷入magisk如果卡在开机屏,只能线刷解决..心累.. 所以,折腾完XPosed框架 ...

  3. Android studio移动项目到另外一个文件夹,结果不能安装的解决方法

    删除.gradle , .idea , build 三个文件夹即可

  4. python基础(13):函数名的使用、第一类对象、闭包、迭代器

    1. 函数名的运用 函数名是⼀个变量,但它是⼀个特殊的变量,与括号配合可以执⾏函数的变量. 1.1 函数名的内存地址 def func(): print("呵呵") print(f ...

  5. SPA项目搭建及嵌套路由

    Vue-cli: 什么是vue-cli? vue-cli是vue.js的脚手架,用于自动生成vue.js+webpack的项目模板,创建命令如下: vue init webpack xxx 注1:xx ...

  6. 【win10】通过环境变量来快速打开应用程序

    step1:建一个空文件夹,并把文件夹路径复制到剪贴板. step2:依次右键点击“此电脑”.属性.高级系统设置.环境变量,定位到“系统变量”,点击新建. (说明:环境变量分为用户变量和系统变量,用户 ...

  7. vue浏览器全屏实现

    1.项目中使用的是sreenfull插件,执行命令安装 npm install --save screenfull 2.安装好后,引入项目,用一个按钮进行控制即可,按钮方法如下: toggleFull ...

  8. opencv::BackgroundSubtraction基本原理

    背景消除 BS算法 - 图像分割(GMM – 高斯混合模型) - 机器学习(KNN –K个最近邻) BackgroundSubtractor (父类) - BackgroundSubtractorMO ...

  9. configure.ac文件和Makefile.am文件 编译

    在编译安装openvpn 项目时遇到,其编译过程如下:生成 configure 可执行文件 make && make install ; . aclocal . autoconf . ...

  10. Mysql—修改用户密码(重置密码)

    1.登录mysql [root@localhost ~]# mysql -uroot -p123456 [root@localhost ~]# mysql -hlocalhost -uroot -p1 ...