无法强制使用https'和Apache同时反向代理

时间:2014-11-10 08:31:06

标签: apache mod-rewrite reverse-proxy

真的把我的大脑放在这个上面。每当用户在我的网站上请求'http'时,我都需要始终强制'https',但同时我需要代理从Apache传递到Tomcat(通过http)。我无法将这两件作品串联起来。

我在httpd.conf中定义了https重定向:

<VirtualHost *:80> ServerName myserver.foo.com
    Redirect / https://myserver.foo.com/
</VirtualHost>

然后代理:

RewriteEngine on
RewriteLog /opt/HTTPServer/logs/rewrite_log
RewriteLogLevel 9
RewriteRule ^/testnew/MyApp(.*)$  http://localhost:8080/test/MyApp$1?product=new  [NC,P,QSA]
RewriteRule ^/testold/MyApp(.*)$  http://localhost:8080/test/MyApp$1?product=old  [NC,P,QSA]

注意:如果我使用ProxyPass, 实际上有效,但我需要能够为请求添加额外的GET参数,因此使用[ P]标志在这里接近。

因此,当我点击以下网址时,我会看到Apache HTTP Server页面,其中显示“ Not Found ”。 http://myserver.foo.com/testnew/MyApp/RunReport

在访问日志中,有一个404

[10/Nov/2014:01:45:21 -0600] "GET /testnew/MyApp/RunReport HTTP/1.1" 404 321

此外,没有任何内容写入重写日志。

据我所知,RewriteRules将执行BEFORE Redirect,所以即使上面的URL确实有效(我不明白为什么没有),它也不会从http重定向到https。那我怎么能做到这一点呢?

我也只使用RewriteRules尝试过这个:

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$  https://%{HTTP_HOST}$1  [R=301]

RewriteRule ^/testnew/MyApp(.*)$  http://localhost:8080/test/MyApp$1?product=new  [NC,P,QSA]
RewriteRule ^/testold/MyApp(.*)$  http://localhost:8080/test/MyApp$1?product=old  [NC,P,QSA]

然而,使用此功能,URL会在第一次重定向后转换为包含https方案和主机名,因此后续的RewriteRules无法匹配。如果我将完整的“https://myserver.foo.com”添加到RewriteRule,它会匹配,但完整的URL会通过代理转换回http。

我无法获胜!在我看来,这似乎是一个相当常见的配置。我完全错过了什么吗?我一直在看这个。

1 个答案:

答案 0 :(得分:0)

我能够通过在*:443 VirtualHost下移动代理RewriteRules并保留http - &gt;来实现此功能。 https在全球范围内,即

Listen 443
<VirtualHost *:443>
    SSLEnable
    SSLClientAuth None
    RewriteEngine On
    RewriteLog /opt/HTTPServer/logs/rewrite_log-443
    RewriteLogLevel 9

    RewriteRule ^/testnew/MyApp(.*)$  http://localhost:8080/test/MyApp$1?product=new [NC,P,QSA]

</VirtualHost>

...
...

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$  https://%{HTTP_HOST}$1  [R=301]

现在工作得非常好。 :)