一直在烦我。
所以,我正在使用 JSP,并且在我实现的 Filter 和我的扩展 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 要么:
- (来自同一域) 显示 Tomcat 的服务器地址,将我重定向到
tomcatserver:8080/app/foo
或 - (来自域外) 卡在加载中。
那么……是什么原因造成的?
附言:我知道从 HttpServlet 中删除 request.getContextPath()
和 "/"
部分可以解决问题,我不是在问那个。
最佳答案
因为 Tomcat 不知道反向代理的主机名。 Tomcat 看到的主机头是针对它自己的。因此,这是 Tomcat 在为重定向等生成绝对 URL 时使用的主机。
您可以使用
更改它ProxyPreserveHost On
在您的 httpd 配置中。
关于apache - 为什么代理下的 getContextPath() 返回的是 HttpServlet 内部的内部路径,而不是 Filter 内部的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050550/