真的把我的大脑放在这个上面。每当用户在我的网站上请求'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。
我无法获胜!在我看来,这似乎是一个相当常见的配置。我完全错过了什么吗?我一直在看这个。
答案 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]
现在工作得非常好。 :)