我想使用 Jetty (6.1.24) 将所有 http 请求重定向到 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 - ok,并且主体是通过 http 的页面,即重定向没有发生。
答案1
就 Jetty 9 而言...如果您的 SSL 连接器已经可以正常工作,您可以按照以下步骤操作:
步骤1:将其添加到 web.xml 中,确保所有内容都通过 SSL。如果您尝试通过 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.xml 中,当 Jetty 遇到 403 !SECURE 错误时,重定向到 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>
答案2
我认为该模式仅匹配 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>
答案3
答案4
据我所知,使用 Jetty 6 附带的任何规则/处理程序都很难做到这一点。
匹配RedirectPatternRule
的target
是 Jetty 服务器中的路径,而不是完整的 URI,因此您的规则永远不会匹配。
您可以将其更改为:
<New id="redirect" class="org.mortbay.jetty.handler.rewrite.RedirectPatternRule">
<Set name="pattern">/*</Set>
<Set name="location">https://foobar.com</Set>
</New>
然而,这有两个问题:
- 它将重定向所有请求(甚至
https
请求) - 它不考虑请求的 URL(它总是重定向到
location
指定的 URL,并忽略与之匹配的任何内容pattern
)
您可以使用一些技巧来克服第一个问题。
您可以将 包装RewriteHandler
在 中ContextHandler
,上下文处理程序允许您指定它将处理来自哪些连接器的请求(setConnectorNames
)。因此,您可以使用它使重写仅适用于 http 连接器上的请求。
但我想不出解决第二个问题的方法。
我认为最好的办法是为此编写自己的重定向规则。如果您没有开发资源来为您执行此操作,请联系我(您可以通过我的博客找到我的电子邮件地址,该博客位于我的个人资料中),我可以快速编写一个(使用与 Jetty 相同的许可证)。编写一条将 http 重定向到 https 的规则非常简单。