1

一直在烦我。

所以,我正在使用 JSP,在我实现的过滤器和扩展的 HttpServlet 中分别有这些方法(简单示例):

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    ((HttpServletResponse) response).sendRedirect(((HttpServletRequest) request).getContextPath() + "/foo");
}

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    response.sendRedirect(request.getContextPath() + "/foo");
}

localhost:8080/app,Filter 和 HttpServlet 都正确地将我重定向到localhost:8080/app/foo.

但是在www.mysite.com/app,它在 Apache 的代理下隐藏了一个tomcatserver:8080/app如下,

RedirectPermanent /app /app/
ProxyPass /app/ http://tomcatserver:8080/app/
ProxyPassReverse /app/ http://tomcatserver:8080/app/

过滤器将我重定向到www.mysite.com/app/foo,而 HttpServlet 要么:

  1. (来自同一域)显示 Tomcat 的服务器地址,将我重定向到tomcatserver:8080/app/foo
  2. (来自域外)只是卡住了加载。

那么……是什么原因造成的?

PS:我知道从 HttpServlet 中删除request.getContextPath()and"/"部分可以解决问题,我不是在问这个问题。

4

1 回答 1

3

因为 Tomcat 不知道反向代理的主机名。Tomcat 看到的主机头是为它自己的。因此,这是 Tomcat 在为重定向等生成绝对 URL 时使用的主机。

您可以使用更改此设置

ProxyPreserveHost On

在您的 httpd 配置中。

于 2012-04-09T13:20:45.940 回答