迁移到新的 HRD 存储后,我想将对旧应用程序的请求重定向到新的 HRD 应用程序。我知道我应该让 Google 迁移工具创建一个别名,但由于我迁移了我的应用程序的中间副本(因为迁移数据库导致的噩梦),所以这不是一个选项。
我的计划是使用一个执行 HTTP 301 (HttpServletResponse.SC_MOVED_PERMANENTLY) 重定向的 servlet,并在 web.xml 中使用带有 /* 的 servlet 映射。这在本地工作,但在真正的应用程序引擎上,它没有。似乎没有应用引擎正确识别的 URL 模式。到目前为止,我有:
<servlet-mapping>
<servlet-name>RedirectToHRD</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RedirectToHRD</servlet-name>
<url-pattern>/*</url-pattern>
<url-pattern>/*/*</url-pattern>
<url-pattern>/*/*/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RedirectToHRD</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RedirectToHRD</servlet-name>
<url-pattern>index.jsp</url-pattern>
</servlet-mapping>
我知道这看起来很疯狂,但我很绝望。只有 '/' 和 'index.jsp' 通过 RedirectToHRD servlet 被重定向。对于其他页面(JSP 或其他任何页面),这不起作用。日志文件只是高兴地表明页面得到了服务。
谁能告诉我发生了什么?
编辑:我按照 Peter Knego 下面的建议做了一个过滤器。现在我的 web.xml 有:
<filter-mapping>
<filter-name>RedirectToHRDFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这仍然无法在“真正的”应用引擎上运行,并且与之前的尝试一样,它在本地运行。我的过滤器有以下方法:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String redirectURL = "http://fit20app-hrd.appspot.com"+request.getRequestURI();
if (request.getQueryString() != null) {
redirectURL += "?"+request.getQueryString();
}
response.setHeader("Location", redirectURL);
}
现在我认为这个过滤器可能被破坏了,即使它在本地工作。在 Google 的服务器上,它适用于 / 和 /index.jsp,但不适用于其他任何东西。
这已经解决了,请参阅下面的评论。