Apache 为什么代理下的getContextPath()返回HttpServlet内部的内部路径,而不是过滤器内部的路径?
一直在烦我 因此,我正在使用JSP,在实现的过滤器和扩展的HttpServlet中分别有以下方法(简单示例):Apache 为什么代理下的getContextPath()返回HttpServlet内部的内部路径,而不是过滤器内部的路径?,apache,tomcat,servlets,servlet-filters,response.redirect,Apache,Tomcat,Servlets,Servlet Filters,Response.redirect,一直在烦我 因此,我正在使用JSP,在实现的过滤器和扩展的HttpServlet中分别有以下方法(简单示例): public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ((HttpServletResponse) response).sendRedirect(((HttpServletRe
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
((HttpServletResponse) response).sendRedirect(((HttpServletRequest) 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/
过滤器将我的ok重定向到www.mysite.com/app/foo
,而HttpServlet:
tomcatserver:8080/app/foo
或p.S.:我知道从HttpServlet中删除
请求.getContextPath()
和“/”
部分可以解决问题,我不是这么问的。因为Tomcat不知道反向代理的主机名。Tomcat看到的主机头是自己的。因此,这就是Tomcat在为重定向等生成绝对URL时使用的主机
您可以使用
ProxyPreserveHost On
在您的httpd配置中
ProxyPreserveHost On