Nginx proxy_pass 仅部分有效

2023-12-09

我有以下设置

  • 主服务器 - 调用它https://master.com
  • 从属服务器 - 调用它https://slave.com

两者都在 Ubuntu 16.04 上运行 Nginx

在主服务器上,我在我的目录中创建了以下配置块/etc/nginx/sites-available/default file

location /test
{
 rewrite ^/test(.*) /$1 break;
 proxy_pass https://slave.com;
 proxy_read_timeout 240;
 proxy_redirect off;
 proxy_buffering off;
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto https;
}

A service nginx reload稍后的master.com我可以执行以下操作

  • 浏览至https://master.com/test并查看输出slave.com\index.php.
  • 浏览至https://master.com/test/test.txt并查看文件中的文本slave.com\test.txt
  • 浏览至https://master/com/test/test.jpg并查看文件中的图像slave.com\test.jpg.

但是,我无法执行以下任何操作

  • 浏览至https://master.com/test/test.php而不是向我显示输出https://slave.com/test.php显示 404 错误消息
  • 浏览至https://master.com/test/adminer/adminer.php它没有向我显示从站上管理员实例的登录屏幕,https://slave.com/adminer/adminer.php显示管理员实例的登录屏幕master.comi.e. https://master.com/adminer/adminer.php

这显然是因为我的 Nginx 配置中缺少一些内容master.com。但是,我看不出那可能是什么。

为了完整起见,这是我在两台服务器上的配置:

Ubuntu- 16.04.3Nginx- 1.10.3PHP- 7.0.22

我应该解释一下为什么^~是必需的,因为从我原来的问题来看这并不清楚。我有另一个块设置来处理 PHP 脚本master.com.

location ~ \.php$ 
{
 try_files $uri =404;
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
 fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;
}

由于 Nginx 处理这些指令的方式,该块在处理时具有优先权.php文件和master.com最终在本地寻找.php实际运行的脚本slave.com。避免这种情况的唯一方法是使用^~


你的做法是错误的。在处理的块内/test你重写它并将其发送出块。这proxy_pass实际上从未发生过,因为新的 URL 没有/test在里面。解决办法很简单,不要使用rewrite

location /test/
{
 proxy_pass https://slave.com/;
 proxy_read_timeout 240;
 proxy_redirect off;
 proxy_buffering off;
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto https;
}

追加/在位置路径的末尾以及proxy_pass服务器将确定之后的内容/test/已发送至您的proxy_pass address

Edit-1

这是我在发布此答案之前设置的示例测试用例。

events {
    worker_connections  1024;
}
http {
server {
   listen 80;

   location /test1 {
     proxy_pass http://127.0.0.1:81;
   }

   location /test2 {
     proxy_pass http://127.0.0.1:81/;
   }

   location /test3/ {
     proxy_pass http://127.0.0.1:81;
   }

   location /test4/ {
     proxy_pass http://127.0.0.1:81/;
   }

}

server {
   listen 81;

   location / {
     echo "$request_uri";
   }
}
}

现在结果解释了所有 4 个位置块之间的差异

$ curl http://192.168.33.100/test1/abc/test
/test1/abc/test

$ curl http://192.168.33.100/test2/abc/test
//abc/test

$ curl http://192.168.33.100/test3/abc/test
/test3/abc/test

$ curl http://192.168.33.100/test4/abc/test
/abc/test

正如你所看到的/test4代理服务器只能看到的url/abc/test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx proxy_pass 仅部分有效 的相关文章

随机推荐

  • 返回 MySQL 中每个“group by”的“最后”行

    有没有更有效的方法来执行以下操作 select from foo as a where a id select max id from foo where uid a uid group by uid group by uid 这个答案看起
  • sed 命令 - 适用于文件夹的所有文本 (.txt) 文件

    我想应用这个 sed 命令 sed begin 644 d file1 txt gt file1 txt 到目录的所有文件 基本上我想保持相同的名称 但在找到某个字符串后删除所有行 我如何调整这个 sed 命令以应用于所有文本 txt 文件
  • 如何使用 Recharts 获取折线图上的悬停元素

    我实际上是新来的 ReactJS 中也有新功能 我想做的是 当我将鼠标悬停在值 1 行上时 只有值 1 数据才会显示在工具提示内 如您所见 此工具提示的情况并非如此 请帮助我真的需要它 在每个 Line 元素上尝试此代码 activeDot
  • 识别数组中相似的实例并将它们合并

    我有一个数组数组 像这样 Abradolf Lincler 4 Abradolf Lincler 4 Scary Terry 4 Abradolf Lincler 4 Scary Terry 4 Scary Terry 4 Abradolf
  • 如何将标记头放置在链接中间

    我想在链接中间放置一个标记 而不是像我的代码那样将其放置在末尾 尽管我用谷歌搜索了它 但我无法找到我的代码的解决方案
  • 为什么我需要 Econo JIT?

    我研究了 Econo JIT 并没有针对编译 IL 的环境进行优化 这与 Normal JIT 不同 此外 它不会为下次执行创建机器代码缓存 这意味着 每次PE运行时 JIT都会再次将IL编译成机器指令 我很困惑为什么 One 会选择在 E
  • 过滤 os.walk() 目录和文件

    我正在寻找一种方法来包含 排除文件模式并从os walk call 这就是我现在正在做的事情 import fnmatch import os includes doc odt excludes home paulo freitas Doc
  • wscript 和 cscript 之间的区别

    cscript 和 wscript 有什么区别 哪个最适合在 Windows 中进行 Telnet 和 FTP 自动化 在 Windows 中 可执行文件可以是控制台应用程序 也可以是 Windows 应用程序 或者是 SFU 或本机应用程
  • 如何在 DataGridView 列中显示 MM/dd/yyyy(无时间)?

    我需要有关 DataGridView 列日期格式的帮助 我希望日期为 MM dd yyyy 我不需要时间 如何以编程方式完成此操作 我已经尝试过这段代码 但它不起作用gridView Columns 1 DefaultCellStyle F
  • 如何将C库编译成.Net dll?

    我们是否可以通过编译包含以下代码的 cpp 项目来将 C 库编译为 Net dll 包含并开放对所有 C 库函数的访问 extern C include
  • Python,“open”和“with open”之间的区别[重复]

    这个问题在这里已经有答案了 我没有使用过with声明 但我对其目的有些熟悉 通过以下代码 1块按预期工作 但是 2 在这里纠正我 应该做与第一个相同的事情 抛出以下异常FileExistsError Errno 17 File exists
  • Swift 中 registerclass 的使用不明确

    我收到错误 ambiguous use of registerclass 当做 tableView RegisterClass cellClass CustomTableViewCell self forCellReuseIdentifie
  • 如何在单个子图中绘制多个信号

    我想将一个或多个信号绘制到一张图中 对于每个信号 可以指定单独的颜色 线宽和线型 如果必须绘制多个信号 还应提供图例 到目前为止 我使用以下代码 它允许我绘制最多三个信号 import matplotlib fig matplotlib f
  • 检查对象列表中的对象类型

    获得一个带有 StackPanel 的 WPF 表单 其中包含带有 StackPanel 的扩展器
  • kafka.cluster.BrokerEndPoint 无法转换为 kafka.cluster.Broker

    我正在尝试将数据从 kafka 流式传输到 Spark 我正在使用 Spark 1 6 2 与 kafka 0 9 0 1 和 scala 2 11 8 当我使用基于接收器的方法时 一切正常 KafkaUtils createStream
  • 在 Linux/MacOS 上双击执行 C++ 可执行文件

    我编写了一个 C 软件 该软件需要从其所在的文件夹中读取文件 然后在同一文件夹中写入其他文件 目前 我通过 shell 导航到复制了可执行文件的文件夹 然后使用以下命令启动它 executable name 我想通过双击来执行它 如果我这样
  • MongoDB+Azure+Android:错误:com.mongodb.MongoException:未与 master 通信且重试已用完

    背景 我有 MongoDB 副本集在 Azure 云服务工作者 Web 角色中运行 使用mongo azure 库 我第一次设置 Android 项目连接到 MongoDB Azure 时 IO 读取和写入 工作正常 然后 由于硬编码测试
  • 如何将数据从 SQL Server 2005 导出到 MySQL [关闭]

    Closed 这个问题是无关 目前不接受答案 我一直在用头撞SQL Server 2005试图获取大量数据 我得到了一个包含近 300 个表的数据库 我需要将其转换为 MySQL 数据库 我的第一个调用是使用 bcp 但不幸的是它不会生成有
  • 使用 Python 捕获单帧(使用网络摄像头)

    我检查了其他解决方案 但他们没有回答我的问题 我的问题是 每当我尝试从视频中仅捕获一帧 我基本上想用网络摄像头拍照 时 我只会看到一个黑色的窗口 Code import cv2 cam cv2 VideoCapture 0 frame ca
  • Nginx proxy_pass 仅部分有效

    我有以下设置 主服务器 调用它https master com 从属服务器 调用它https slave com 两者都在 Ubuntu 16 04 上运行 Nginx 在主服务器上 我在我的目录中创建了以下配置块 etc nginx si