写在前面的话

在 nginx 中,我们很多时候都有一个疑问,在 proxy_pass 或者 root 或者 location 后面需不需要加上 /,加和不加有啥区别。

root  / alias 后面的 /

root 和 alias 都是指向目录,所以后面是否存在 / 没有影响:

  1. server {
  2. listen 8082;
  3. server_name localhost;
  4.  
  5. location ^~ /root/ {
  6. root /data/www/root/;
  7. index index.html index.htm;
  8. }
  9.  
  10. location ^~ /alias/ {
  11. alias /data/www/alias/;
  12. index index.html index.htm;
  13. }
  14. }

我们这里加不加红色的 / 都一样的结果。

location 后面的 /

在 location 中也存在是否添加 /  的情况:

  1. server {
  2. listen 8082;
  3. server_name localhost;
  4.  
  5. location ^~ /alias/ {
  6. echo "WITH: /";
  7. }
  8.  
  9. location ^~ /alias {
  10. echo "WITHOUT: /";
  11. }
  12. }

此时两种匹配就有了两个含义,前者只能匹配 /alis/123 这样的,而后者可以匹配 /alias123,也可 /alias/123 这样的。

但是当两者同时在一个 server 中由于匹配精确度越高优先级越高的原因,后者匹配不到 /alias/123

proxy_pass 后面的 /

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

我们新建这样的目录结构,然后配置 nginx:

  1. server {
  2. listen 7000;
  3. server_name localhost;
  4.  
  5. location / {
  6. root /data/www/proxy_pass;
  7. }
  8. }

此时我们可以访问这 4 个 html 文件测试:

这个时候我们做反向代理:

  1. # 代理不带项目名称,没有 /
  2. server {
  3. listen 7001;
  4. server_name locahost;
  5.  
  6. location /proxy/ {
  7. proxy_pass http://127.0.0.1:7000;
  8. }
  9. }
  10.  
  11. # 代理不带项目名称,但是有 /
  12. server {
  13. listen 7002;
  14. server_name locahost;
  15.  
  16. location /proxy/ {
  17. proxy_pass http://127.0.0.1:7000/;
  18. }
  19. }
  20.  
  21. # 代理带项目名称,没有 /
  22. server {
  23. listen 7003;
  24. server_name locahost;
  25.  
  26. location /proxy/ {
  27. proxy_pass http://127.0.0.1:7000/other;
  28. }
  29. }
  30.  
  31. # 代理带项目名称,但是有 /
  32. server {
  33. listen 7004;
  34. server_name locahost;
  35.  
  36. location /proxy/ {
  37. proxy_pass http://127.0.0.1:7000/other/;
  38. }
  39. }

此时我们访问测试同一 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. WPF ListBox 隐藏滑块

    <ListBox ScrollViewer.VerticalScrollBarVisibility = "Disabled"; </ListBox>

  2. 计科菜鸟玩生信(一)——Windows10下用docker安装GATK

    1.官网下载GATK. (学校网速实在是太慢了,下载几个小时到自闭) 下载地址:https://software.broadinstitute.org/gatk/download/ 下载完成后文件夹中 ...

  3. 完美解决linux下vim在终端不能用鼠标复制的问题

    在vim 中输入 :set mouse=r 就行了,还不行的话 :set mouse=v

  4. 新手教程丨利用Python制作一款截图识别软件!

    进入正文前给大家推荐一个微软开发的工具:Snipaste. 这是一款截图软件,把截出的图片放置到窗口上,可以随意移动,使用非常方便,并且支持各类电脑系统. 先简单介绍一下它的用法,F1截图,Ctrl+ ...

  5. Qt在window下的环境变量PATH的配置

    Qt在window下的环境变量PATH的配置 路劲: C:\Qt\Qt5.6.0\5.6\mingw49_32\bin C:\Qt\Qt5.6.0\Tools\mingw492_32\bin 发布Qt ...

  6. mysql connector c++ 1.1 安装

    mysql connector c++ 1.1 安装 前提:boost安装完毕 注意:8.0版本的源码用此方法,编译不过.所以要编译8.0的同学请绕行. 1,下载源码 git clone https: ...

  7. Vysor

    官网:http://www.vysor.io/ Vysor用 PC远程控制投影安卓手机/平板工具 Vysor 是一个免费的google浏览器插件. 它可以让你在pc上控制你的Android手机.平板等 ...

  8. 在C++工程上添加CUDA编译环境

    1.直接在新建工程的时候选择CUDA,这样的工程既能编译C++也能编译CU 2.在已有的C++工程上添加CUDA编译环境 右键工程-->生成依赖项-->生成自定义-->勾选CUDA ...

  9. 2.Python网络编程_TCP(简略版)

    TCP监听套接字: 当新的客户端请求连接时,服务器端监听套接字收到消息,会分配一个新的套接字对应于客户端(新socket包括四部分:源IP.源端口号.目的IP.目的端口号)用于接收客户端的消息,仔细观 ...

  10. Session中短信验证码设置有效时间

    Session中短信验证码设置有效时间 package com.mozq.boot.kuayu01.controller; import org.springframework.web.bind.an ...