Apache 使用反向代理和匹配上下文路径将 http 重定向到 https

Apache 使用反向代理和匹配上下文路径将 http 重定向到 https

在 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 重定向现在可以按预期工作。

相关内容