我正在运行 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