2015-05-27 55 views
1

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

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

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

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

头。这是麻烦的根源。在我的浏览器上,自然而然,它被解释为相对于当前服务器而不是反向代理。在找到一个位置标题的地方后,我尝试了黑客的代码,但是它只是停止了它的踪迹。

我该如何防止这种情况发生?我曾考虑过在Nginx上运行一个Lua脚本来检查头文件并将其替换掉,但是这让我感到不知所措,即使我能够运行它,我也会让我的服务器执行大量不必要的工作。

我非常感谢任何帮助。


编辑

探索这个问题后有点多,我开始认为adminer可能不是做太多的错误。它实际上使用$ _SERVER ['REQUEST_URI']值来构造位置标题,而这恰好来自/admin/adminer.php。我注意到referer,$ _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安装小瓶易于得到的nginx-演员(Lua中模块启用味)
  • PHP5-FPM 5.5 0.9
  • MariaDB的10
  • Adminer 4.2.1

回答

1

我遇到了同样的问题,我想出的最简单的解决方法是修补adminer 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你可以简单地包含adminer.php的目录中运行 patch < /path/to/fix你应该得到的正常工作版本。如果需要,运行patch -R < /path/to/fix将恢复原始行为。


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

+0

非常感谢你的这个提示。这将成为一种拯救生命的方式。 – DroidOS