如何让Jetty将httpredirect到https

我想要使​​用Jetty(6.1.24)将http的所有请求redirect到https。 出于某种原因(我的无知),这是逃避我。 这是我的:

<New id="redirect" class="org.mortbay.jetty.handler.rewrite.RedirectPatternRule"> <Set name="pattern">http://foobar.com/*</Set> <Set name="location">https://foobar.com</Set> </New> 

作为回应,我得到了200 – 好,身体是通过HTTP的页面,即redirect不会发生。

说到Jetty 9 …如果你的SSL连接器已经工作,你可以这样做:

第1步:确保一切都通过SSL添加到您的web.xml。 如果您尝试通过HTTP访问资源,这将返回403!SECURE错误

 <security-constraint> <web-resource-collection> <web-resource-name>Everything</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> 

第2步:通过将Jetty添加到您的jetty.xml中,将Jettyredirect到HTTPS

 <New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <Arg> <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <!-- This says... Redirect to https://host:8443 if server returns "NOT SECURE" error --> <Set name="secureScheme">https</Set> <Set name="securePort">8443</Set> </New> </Arg> <Call name="addCustomizer"> <Arg> <New class="org.eclipse.jetty.server.SecureRequestCustomizer" /> </Arg> </Call> </New> <!-- This is your HTTP connector, you should have another one for HTTPS --> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg name="server"> <Ref refid="MyServer" /> </Arg> <Arg name="factories"> <Array type="org.eclipse.jetty.server.ConnectionFactory"> <Item> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg name="config"> <!-- defined above --> <Ref refid="tlsHttpConfig" /> </Arg> </New> </Item> </Array> </Arg> <Set name="host">localhost</Set> <Set name="port">8080</Set> </New> 

我认为模式只匹配URI。 你应该使用像这样的东西:

 <New id="forwardedHttps" class="org.eclipse.jetty.rewrite.handler.ForwardedSchemeHeaderRule"> <Set name="header">X-Forwarded-Scheme</Set> <Set name="headerValue">https</Set> <Set name="scheme">https</Set> </New> 

请参阅: http : //download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/rewrite/handler/RewriteHandler.html

据我所知,与Jetty 6一起提供的任何规则/处理程序并不容易。

RedirectPatternRule匹配Jetty服务器中的path,而不是完整的URI,因此您的规则永远不匹配。

您可以将其更改为:

 <New id="redirect" class="org.mortbay.jetty.handler.rewrite.RedirectPatternRule"> <Set name="pattern">/*</Set> <Set name="location">https://foobar.com</Set> </New> 

但是,这有两个问题:

  1. 它会redirect所有的请求(甚至https请求)
  2. 它不考虑请求的URL(它总是redirect到指定的location ,并忽略任何与该pattern匹配的内容)

你可以用一些欺骗手段来克服第一个问题。
您可以将RewriteHandler包装在ContextHandler ,并且上下文处理程序允许您指定它将处理来自( setConnectorNames )的请求的连接器。 所以,你可以使用它来使重写只适用于HTTP连接器上的请求。

我想不出一个办法来克服第二个问题。

我认为你最好的select是为自己写一个redirect规则。 如果你没有开发资源为你做,那么联系我(你可以通过我的博客find我的电子邮件地址,这是我的个人资料),我可以掀起一个(在与Jetty相同的许可下)。 编写一个简单的httpredirect到https的规则是非常简单的。

我刚刚添加了文档: http : //wiki.eclipse.org/Jetty/Howto/Configure_SSL#Redirecting_http_requests_to_https