我在 Varnish 缓存前面设置了一个 HAProxy,它请求一个 Apache2 服务器。
Apache 正在端口 12345 上监听内部 IP,并配置为UseCanonicalPhysicalPort Off
防止溢出该内部专用端口。我还测试了UseCanonicalPhysicalPort
和UseCanonicalName
以及On
的不同组合Off
。然而,尽管有这些规范指令,Apache2 在接收没有尾部斜杠的目录请求时似乎会出现问题:
UCPP: On, UCN: Not set:
Request: https://www.example.org/test-page
Response: Redirect(301) to http://www.example.org:12345/test-page/
UCPP: On, UCN: On
Request: https://www.example.org/test-page
Response: Redirect(301) to https://www.example.org:12345/test-page/
UCPP: Off, UCN: Off
Request: https://www.example.org/test-page
Response: Redirect(301) without Location header
这当然行不通,因为这个端口只是内部端口。该网站运行的是 Joomla,它与此设置配合得很好,只是那些从 mod_dir 重定向的文件夹似乎不起作用。我的 Apache 配置如下所示:
<VirtualHost 192.168.150.100:12345>
ServerName www.example.org
UseCanonicalPhysicalPort Off
UseCanonicalName On
<Directory "/var/www/www.example.org">
[...]
</VirtualHost>
有没有办法防止这些重定向?最好的办法是防止 Apache 内部出现这些错误的重定向,但我愿意对 Varnish 或 HAProxy 的配置进行更改。
笔记:请不要建议使用端口 80,因为我在 Apache 上有多个端口被 varnish 使用(一种让 VHosts 更好地运行的解决方法),因此这不是选择。
答案1
没有尾部斜杠的目录 URL 不是此资源的规范 URL,这就是为什么mod_dir重定向用户。这是 W3C 的一般建议。
使用自定义端口进行重定向可能是因为您的 HAproxy 或 Varnish 正在创建一个新的 HTTP 请求并发送给 Apache。您的 Apache 收到的第一个请求的端口已经存在。这就是和似乎无效的12345
原因。UseCanonicalName
UseCanonicalPhysicalPort
但你可以通过设置mod_dir DirectorySlash
指令Off
。
如果test-page
实际上是文件系统上现有的目录,那么它应该可以正常工作。