mod_rewrite无法保护grails应用程序

时间:2013-01-25 09:54:57

标签: apache tomcat grails mod-rewrite mod-proxy

我有一个在tomcat上运行的grails应用程序,我正在使用mod_proxy来连接http服务器。我的目标是确保登录过程。

强制https的我的VirtualHost配置是:

ProxyPass /myapp/ http://127.0.0.1:8080/myapp
ProxyPassReverse /myapp/ http://127.0.0.1:8080/myapp

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(myapp/login) https://%{HTTP_HOST}:443/$1 [NC,R=301,L]

当我转到需要身份验证的https://mydomain.com/myapp/adm时,它会重定向到http://mydomain.com/myapp/login/auth;jsessionid=yyyyyy,没有任何安全性,因此重写无效(如果我用https手动替换http,它可以正常工作)。< / p>

任何提示?

3 个答案:

答案 0 :(得分:1)

  

当我去https://mydomain.com/myapp/adm - 这需要   身份验证 - 重定向到   http://mydomain.com/myapp/login/auth;jsessionid=yyyyyy

看起来Spring安全执行重定向到/ login / auth。 Burt Beckwith提到here Spring安全性不需要grails.serverURL。 它应该使用request.getServerName() 基本上grails.serverURL已用于createLink methods

我建议:

  1. 尝试在grails.serverURL中使用https用于生产环境
  2. 设置应用上下文(如果第1项)没有帮助):

    grails.app.context = “/ MyApp的”

  3. <强>更新

    只是为了孤立并更好地了解问题所在:

    请你用https运行grails(在开发环境中)并检查一切是否正常:

    grails run-app -https
    

答案 1 :(得分:1)

你弄错了,你想要这个:

RewriteRule ^/myapp/login https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]

您当前的RewriteRule无法匹配

我也怀疑这有什么意义

RewriteCond %{THE_REQUEST} ^[A-Z]+\s/myapp/login [NC]

这只会重复RewriteRule中您想要的^ / myapp / login。因此,虽然它有效但它没有用处。

答案 2 :(得分:1)

在允许http和https的设置中,将单独的Connector元素添加到tomcat的conf / server.xml文件中:

<Connector port="8081" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443"  URIEncoding="UTF-8"
           scheme="https" secure="true" proxyName="somehostname.domain" proxyPort="443" />

如果只允许https,您可以将scheme,secure,proxyName和proxyPort属性添加到现有的Connector元素。

在apache配置中,使用额外属性将*:443虚拟主机代理设置为连接器。普通的http *:80可以连接到原始连接器。

了解更多信息: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Proxy_Support http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html