在 Apache 2.4.39 中,当反向代理和上下文路径匹配时,我无法使 http 到 https 重定向正常工作。
例如,我想要http://www.example.com/foo重定向至https://www.example.com/foo当“ProxyPass /foo”也存在时。
我遵循了这里的建议,根据谷歌搜索,这是相当标准的建议: https://stackoverflow.com/a/21798882/4410356
所以我基本上有:
<VirtualHost *:80>
ServerName www.example.com
Redirect / https://www.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration here ...
ProxyPass /foo http://localhost:9999/foo
ProxyPassReverse /foo http://localhost:9999/foo
</VirtualHost>
但是,从 http 到 https 的重定向似乎仅在没有匹配的 ProxyPass 路径时才有效。例如:
http://example.com/foo => http://example.com/foo http://example.com/bar => https://example.com/bar
以下重写规则有效,但 Apache 建议不要使用重写:
RewriteCond %{HTTPS} !=on RewriteRule "^/?(.*)" https://galaxy.erdc.hpc.mil/$1 [R,L]
Apache 文档还指出:
对于 http 到 https 重定向的情况,如果您无权访问主服务器配置文件,而必须在 .htaccess 文件中执行此任务,则使用 RewriteRule 会比较合适。
但对我来说情况并非如此(我可以访问配置文件)。
是否可以在不使用重写规则的情况下在此设置中使 http 重定向正常工作?
答案1
尝试使用相同的配置,但使用 Location 参数来分解你的 ProxyPass 配置
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration here ...
<Location "/foo/">
ProxyPass http://localhost:9999/foo
ProxyPassReverse http://localhost:9999/foo
</Location>
</VirtualHost>
答案2
首先,我很抱歉,根据我的实际设置(翻译网址、名称和部分),我的问题似乎无效。
ssl.conf
正如问题所示,我的 ProxyPass* 指令不在 VirtualHost 块内,而是在默认 VirtualHost 块之上的全局级别应用。
通过将 ProxyPass 指令移入默认的 VirtualHost 块,当上下文路径与 ProxyPass 路径匹配时,HTTP -> HTTPS 重定向现在可以按预期工作。