我正在运行Nginx,它被配置为允许我访问另一台可用作反向代理的服务器上的多个资源。例如
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
头。这是麻烦的根源。在我的浏览器中,这自然会被解释为相对于当前服务器而不是反向代理的含义。在找到一个有一个Location标题的地方之后,我试图破解了adminer代码,但这只是让它停在了它的轨道上。
如何防止这种情况发生?我考虑在Nginx上运行一个Lua脚本来检查标题并替换它,但它让我感到震惊,即使我让它工作,我也会让我的服务器做大量不必要的工作。
我很感激任何帮助。
修改
在更多地探讨这个问题之后,我开始认为adminer可能没有做错。它实际上使用$ _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提供了更简单的替代方案吗?
我或许应该提一下
答案 0 :(得分:5)
我遇到了同样的问题,这就是我的解决方法:
{{1}}
答案 1 :(得分:1)
我遇到了同样的问题,我能想出的最简单的解决方法是修补adminer 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
将恢复原始行为。
要了解补丁文件的结构,请阅读this SO thread。