如何避免 Wicket 将页面从 HTTPS 重定向到 HTTP

How to avoid Wicket redirecting page from HTTPS to HTTP

我使用 wicket 8.10,它安装在 tomcat 上并由 nginx 代理。在 nginx 配置中配置的 SSL 证书。 Nginx 也将所有 HTTP 请求转发到 HTTPS。

问题如下:

当我提交任何表单 wicket returns 响应 headers,其中 Location 标签包含 url 和 HTTP 协议。

为什么重要:

最后的 chrome 更新使浏览器在 Location 包含 HTTPS 打开的页面上的 HTTP 协议时显示警报。在此之前,nginx 悄悄地重定向了请求,但现在用户从浏览器看到警告页面(类似于证书无效或不存在时)。

这里的问题是您的 Wicket 应用程序不知道它在代理后面。

有两种解决方法:

  1. 使用XForwardedRequestWrapperFactory

它会将 Tomcat 的 HttpServletRequest 与读取 X-Forwarded-*** 请求 header 的 HttpServletRequest 包装起来。 只要确保 Nginx 导出 X-Forwarded-Proto 请求 header

  1. 使用HttpsMapper

只需在生产模式下将 protected Scheme getDesiredSchemeFor(Class<? extends IRequestablePage> pageClass) 覆盖为 return Scheme.HTTPS,在开发模式下将 Scheme.HTTP 覆盖(我假设您在开发时不使用 Nginx 代理)

我找到的最简单的解决方案是使用 nginx 指令:

proxy_redirect http://example.com https://example.com;

它将位置从 http://example.com/any/path to https://example.com/any/path

更改为 header