Apache ajp反向代理将特定页面redirect到https

我有Apache负载平衡反向代理mod_proxy_ajp运行和redirect到后端tomcat服务器。 我还为HTTPS (SSL)创build了一个单独的虚拟主机以及HTTP虚拟主机。 下面的http://my.domain.net/https://my.domain.net/虚拟主机都可以访问并单独工作。

http ##:

 <VirtualHost *:80> ServerName my.domain.net ProxyRequests On ProxyVia On ProxyPreserveHost On ProxyErrorOverride On ProxyStatus On <Proxy balancer://ClusterDomain> Order deny,allow Allow from all BalancerMember ajp://192.168.1.22:8009 route=web1 redirect=web2 ttl=300 timeout=5 retry=60 BalancerMember ajp://192.168.1.23:8009 route=web2 redirect=web1 ttl=300 timeout=5 retry=60 BalancerMember ajp://192.168.1.21:8009 route=balancer1 status=+H disablereuse=on ProxySet lbmethod=byrequests ProxySet stickysession=JSESSIONID|jsessionid </Proxy> ProxyPass /errors ! ProxyPass /balancer-manager ! ProxyPass / balancer://ClusterDomain/ nofailover=off ProxyPassReverse / balancer://ClusterDomain/ # Balancer-manager for ajp proxy nodes management <Location /balancer-manager> SetHandler balancer-manager Order deny,allow Allow from all </Location> #Recording virtual host logs LogLevel Debug CustomLog /var/log/apache2/my.domain.com-access.log combined ErrorLog /var/log/apache2/my.domain.com-error.log </VirtualHost> 

https ##:

 NameVirtualHost 123.123.123.123:443 <VirtualHost 123.123.123.123:443> ServerName my.domain.net SSLEngine on SSLProxyEngine On SSLCertificateFile /etc/ssl/myapp/server.crt SSLCertificateKeyFile /etc/ssl/myapp/server.pem ProxyRequests On ProxyVia On ProxyPreserveHost On ProxyErrorOverride On ProxyStatus On <Proxy balancer://ClusterDomain> Order deny,allow Allow from all BalancerMember ajp://192.168.1.22:8009 route=web1 redirect=web2 ttl=300 timeout=5 retry=60 BalancerMember ajp://192.168.1.23:8009 route=web2 redirect=web1 ttl=300 timeout=5 retry=60 BalancerMember ajp://192.168.1.21:8009 route=balancer1 status=+H disablereuse=on ProxySet lbmethod=byrequests ProxySet stickysession=JSESSIONID|jsessionid </Proxy> ProxyPass /errors ! ProxyPass / balancer://ClusterDomain/ nofailover=off ProxyPassReverse / balancer://ClusterDomain/ BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 # MSIE 7 and newer should be able to use keepalive BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> 

我在SFsearch,如果有人已经问这个问题,但没有find。 他们中的大多数人问如何完全从httpredirect到https,但在我的情况下,它有点不同,因为我只希望特定的页面被redirect到受保护的页面,但是在使用http尝试时不应该redirect到https。

基于上面的虚拟主机,我如何redirect一个特定的http页面(让http://my.domain.net/register )来保护https( https://my.domain.net/register )页面。 是否有可能使用ajp代理? 我需要单独访问http和https访问,但只有特定的页面应该被强制redirect到受保护的页面。 我可以这样做吗?

更新1

我真的很了解apache重写规则!!!

正如KM01所build议的,我尝试了重写规则。

即使在httpsredirect的虚拟主机中追加了以下规则之后,访问http://my.domain.net/register时,也很简单,只需redirect到http页即可忽略规则。

rewrite规则,

 RewriteRule ^/register/$ https://my.domain.net/register [R=301] 

(要么)

我也尝试与Redirect

 RedirectMatch ^/register/$ https://my.domain.net/register 

更新2

尝试了一段时间后,有一些基本的想法!

我得到了rewriteredirect工作! 关键是排除代理redirect页面(/注册),应该redirect到安全的https页面!

首先Redirect工作,

 ProxyPass /register ! RedirectMatch /register https://my.domain.net/register #(or) RedirectMatch permanent /register https://my.domain.net/register 

Rewrite

即使从代理排除/register不起作用。 尽pipe启用了重写模块RewriteEngine on但我必须使用RewriteEngine on

追加下面的工作,

 ProxyPass /register ! RewriteEngine on RewriteRule ^/register/$ https://my.domain.net/register [R=301] 

我不知道这是否是正确的方法,但是让它在KV01的帮助下工作

感谢KV01!

你可以通过重写/redirect来实现你正在做的事情。 像这样的东西在你的虚拟主机configuration应该工作(请先在testing服务器上testing,然后再进行生产):

 #requires mod_rewrite RewriteRule ^/register$ https://my.domain.com/register [R=301] 

这个规则说只redirect开始( ^ )和结束( $ )之间的包含/register 。 这不会redirect任何其他path,只是这一个。

HTH