我需要在客户服务器上的 Apache2 安装前安装一个反向代理。该反向代理的作用是代理子域下的一些其他应用程序(在其他端口上内部运行)、处理 SSL 终止和其他一些事情。现有的应用程序 URL 应该仍然有效,因此它还必须代理现有的 Apache。该服务器相当老旧,运行的是 Apache 2.4.7。
我的问题是这样的:我已将 Caddy 设置为反向代理并将其配置为透明,因此Host
标头被转发。
然后,我将 Apache 配置为监听端口 81 而不是 80,这样 Caddy 就可以监听 80 并将请求转发到 81。
问题是,当 Apache 构建自引用 URL 时(例如重定向到尾部斜杠时),它仍将包含:81
在 URL 中(在 PHP 中SERVER_PORT
也是 81)。我已经设置了UseCanonicalPhysicalPort off
和UseCanonicalName off
,但仍然会发生这种情况(主机名正确,但端口不正确)。
请注意,如果我将反向代理放在非标准端口(如 2015)上(因此Host
标头现在也将包括:2015
在末尾),那么它实际上会起作用,Apache 也会返回重定向到 2015 的 URL(PHP 也会将其视为SERVER_PORT
2015 而不是 81),但如果端口为 80,则不会返回,因此Host
标头中没有端口。似乎如果标头中没有端口Host
,Apache 会回退到物理端口,而不是简单地省略端口(并向 PHP 报告 80)。文档说它应该首先考虑端口ServerName
,但即使我:80
在末尾添加,也没有什么区别。
我能做什么呢?
(我还担心 SSL 以后会发生什么,但我还没有到那一步。)
apache2ctl -S
输出:
VirtualHost configuration:
*:81 localhost (/etc/apache2/apache2.conf:277)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/lock/apache2" mechanism=fcntl
Mutex mpm-accept: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33
我有一个解决方法,但这是一个不寻常的配置,可能会让下一个在这个服务器上工作的人绊倒,而且我通常也不会这样配置,所以我不确定它可能会带来什么意想不到的问题...但无论如何:我可以将 Caddy 设置为仅绑定在外部 IP 上,将 Apache 设置为仅绑定在本地主机上,然后让它们两个都在端口 80 上,但在不同的接口上。然后它就可以正常工作了。- 不过,我还是想解决根本问题。