Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 为什么代理下的getContextPath()返回HttpServlet内部的内部路径,而不是过滤器内部的路径?_Apache_Tomcat_Servlets_Servlet Filters_Response.redirect - Fatal编程技术网

Apache 为什么代理下的getContextPath()返回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

一直在烦我

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

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:

  • (来自同一域)显示Tomcat的服务器地址,将我重定向到
    tomcatserver:8080/app/foo
  • (从域外)刚被卡住加载
  • 所以。。。这是什么原因造成的


    p.S.:我知道从HttpServlet中删除
    请求.getContextPath()
    “/”
    部分可以解决问题,我不是这么问的。

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

    您可以使用

    ProxyPreserveHost On
    
    在您的httpd配置中

    ProxyPreserveHost On