6

我正在运行 Nginx,它被配置为允许我访问另一台服务器上的多个资源,该服务器可用作反向代理。例如

main server:http://example.com
slave: http://example.com/slave
adminer on slave: http://example.com/slave/admin/adminer.php

到目前为止一切都很好。我在Adminer中输入我的数据库用户名和密码,问题就开始了。检查管理员登录后返回的标头,我注意到它发回了一个

Location:/admin/adminer.php?username=user

标题。这是麻烦的根源。在我的浏览器上,这自然会被解释为相对于当前服务器而不是反向代理的含义。在找到一个有 Location 标头的地方后,我尝试破解管理员代码,但这只是阻止它死在轨道上。

我怎样才能防止这种情况发生?我曾考虑在 Nginx 上运行一个 Lua 脚本来检查标题并替换它,但让我震惊的是,即使我让它工作,我也会让我的服务器做大量不必要的工作。

我非常感谢任何帮助。


编辑

在进一步探讨了这个问题之后,我开始认为管理员可能没有做错太多。它实际上使用 $_SERVER['REQUEST_URI'] 值来构造位置标头,而这恰好与/admin/adminer.php. 我注意到引用者 $_SERVER['HTTP_REFERRER'] 具有完整的原始请求路径http://example.com/slave/admin/adminer.php。所以解决方案是发回位置/slave/admin/adminer.php?username=user

简单的?好吧,问题是在我的设置/slave/中是可变的,所以我需要在代码中解决它。我可能可以用一点 PHP 相当容易地做到这一点,但我想知道...... Nginx 提供了一个更简单的替代方案吗?

我也许应该提到

  • 主从设备上的 Ubuntu 14.04
  • Nginx 1.6.2 安装小瓶 apt-get nginx-extras(启用 Lua 模块的风味)
  • php5-fpm 5.5.9
  • 玛丽亚数据库 10
  • 管理员 4.2.1
4

2 回答 2

14

我有同样的问题,这就是我解决它的方法:

upstream adminer {
    server adminer;
}

server {
    listen 80;

    location /adminer/ {
        proxy_set_header X-Forwarded-Prefix "/adminer";
        proxy_pass http://adminer/;
    }
}
于 2018-09-25T19:08:57.787 回答
1

我遇到了同样的问题,我能想到的最简单的解决方法是修补管理员 PHP 脚本。我只是像这样$_SERVER["REQUEST_URI"]开始硬编码:adminer.php

--- adminer.php 2015-10-22 12:31:18.549068888 +0300
+++ adminer.php 2015-10-22 12:31:40.097069554 +0300
@@ -1,4 +1,5 @@
 <?php
+$_SERVER["REQUEST_URI"] = "/slave/admin/adminer.php";
 /** Adminer - Compact database management
 * @link http://www.adminer.org/
 * @author Jakub Vrana, http://www.vrana.cz/

如果您将上述内容放在一个名为的文件中,fix您可以简单地 patch < /path/to/fix在包含adminer.php您应该获得正确工作版本的目录中运行。如果需要,运行patch -R < /path/to/fix将恢复原始行为。


要了解补丁文件的结构,请阅读此 SO 线程

于 2015-10-22T10:02:04.553 回答