我已经为网站启用了 HTTPS,现在所有对 HTTP 的请求都应重定向到 HTTPS,除了对于一个目录的内容,例如/downloads
。
我按如下方式更改了 HTTP 的 VirtualHost 配置并添加了RedirectMatch
设置:
<VirtualHost *:80>
ServerName example.com
RedirectMatch 302 ^/(?!download/).*$ https://example.com$1
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://10.0.0.11:3000/
ProxyPassReverse / http://10.0.0.11:3000/
</VirtualHost>
# configuration for HTTPS down here, working fine
我的期望:诸如的请求http://example.com/faq
将被重定向到 HTTPS 版本,并且诸如的所有请求http://example.com/download/file.zip
仍为 HTTP。
但显然,Proxy*
指令优先级更高,并且根本没有发生任何重定向。
我应该如何正确构建我的配置,以便我可以使用RedirectMatch
,并且在它不匹配的情况下使用该Proxy*
设置?
答案1
好吧,只见树木不见森林。解决方案很简单:
<VirtualHost *:80>
ServerName example.com
RedirectMatch 302 ^/(?!download/).*$ https://example.com$1
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /download/ http://10.0.0.11:3000/download/
ProxyPassReverse /download/ http://10.0.0.11:3000/download/
</VirtualHost>
因此,代理指令仅对被排除的路线生效RedirectMatch
。