管理员通过反向代理登录

Adminer login via a reverse proxy

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

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

到目前为止一切正常。我在 Adminer 中输入我的数据库用户名和密码,然后麻烦就开始了。检查管理员 post-login 返回的 headers 我注意到它发回了

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

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

如何防止这种情况发生?我考虑过 运行 Nginx 上的 Lua 脚本来检查 header 并替换它,但令我震惊的是,即使我让它工作,我也会让我的服务器做得很好处理不必要的工作。

我将不胜感激任何帮助。


编辑

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

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

也许我应该提一下

我遇到了同样的问题,我能想到的最简单的解决方法是修补管理员 PHP 脚本。我只是在 adminer.php 的开头对 $_SERVER["REQUEST_URI"] 进行了硬编码,如下所示:

--- 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 将在需要时恢复原始行为。


要了解补丁文件的结构,请阅读 this SO thread

我遇到了同样的问题,我是这样解决的:

upstream adminer {
    server adminer;
}

server {
    listen 80;

    location /adminer/ {
        proxy_set_header X-Forwarded-Prefix "/adminer";
        proxy_pass http://adminer/;
    }
}