Apache Tomcat重定向将用户带出域

Apache Tomcat重定向将用户带出域,apache,tomcat,Apache,Tomcat,我的web.xml中有此配置 <servlet> <servlet-name>welcome</servlet-name> <servlet-class>com.me.util.WelcomeServletPublic</servlet-class> <init-param> <param-name>redirect</param-name> &

我的web.xml中有此配置

<servlet>
    <servlet-name>welcome</servlet-name>
    <servlet-class>com.me.util.WelcomeServletPublic</servlet-class>
    <init-param>
        <param-name>redirect</param-name>
        <param-value>/login/login.action</param-value>


    </init-param>
    </servlet>
<welcome-file-list>
        <welcome-file>welcome</welcome-file>
    </welcome-file-list>

欢迎
com.me.util.WelcomeServletPublic
重新使用
/login/login.action
欢迎
在我的开发环境中,这个重定向工作得很好。现在所有的东西都被转移到了我的生产环境中,重定向就不起作用了

应该发生的是当你去的时候,它会把你重定向到

所发生的是它重定向到,它失去了域名

现在,让我想知道它哪里出了问题的一件大事是我的生产服务器是如何配置的

在前门,我让apache运行mod_jk。有两个听众,80和443。80侦听器配置了mod_rewrite以获取http://url并将其重写为https://。443侦听器然后接收请求并将其转储到mod_jk,mod_jk通过端口8009将请求重定向到tomcat。tomcat正在运行大约6个应用程序,每个应用程序都有自己的vhost

我从来没有做过这样的配置,也不知道该在哪里进行故障排除。我知道我不能从servlet中的url中取出前面的/因为如果有人访问mydomain.com/users,它会将他们重定向到mydomain.com/users/login/login.action,所以我真的不知道从哪里开始

这是我的apachevhost配置

    <VirtualHost 10.99.10.30:80>
        ServerName boardingsurvey.mydomain.org
        ServerAlias boardingsurvey.mydomain.org

        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

<VirtualHost 10.99.10.30:443>
        ServerName boardingsurvey.mydomain.org
        ServerAlias boardingsurvey.mydomain.org
        DocumentRoot /var/www/vhosts/bss
        <Directory "/var/www/vhosts/bss">
                AllowOverride None
                Options Indexes FollowSymLinks
                Order allow,deny
                Allow from all
        </Directory>

        JkMount /* bss

        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXP56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        SSLCertificateFile /etc/apache2/ssl/ssl.crt
        SSLCertificateKeyFile /etc/apache2/ssl/ssl.key
        SSLCertificateChainFile /etc/apache2/ssl/intermediate.crt
</VirtualHost>


~

ServerName boardingsurvey.mydomain.org
ServerAlias boardingsurvey.mydomain.org
重新启动发动机
重写条件%{HTTPS}关闭
重写规则(*)https://%{HTTP\u HOST}%{REQUEST\u URI}
ServerName boardingsurvey.mydomain.org
ServerAlias boardingsurvey.mydomain.org
DocumentRoot/var/www/vhosts/bss
不允许超限
选项索引跟随符号链接
命令允许,拒绝
通融
JkMount/*bss
斯伦金安
SSLCipherSuite全部:!ADH:!EXP56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile/etc/apache2/ssl/ssl.crt
SSLCertificateKeyFile/etc/apache2/ssl/ssl.key
SSLCertificateChainFile/etc/apache2/ssl/intermediate.crt
~

上面的评论就是问题所在。我的welcomeservlet在url中添加了一个额外的/,这正是我重写的地方

关于为什么会发生这种情况的完整解释如下

通过向重定向添加额外的“/”,重定向使用的路径为//login/login.action

这种类型的URL通常被称为“协议相关”URL,尽管正确的名称是“网络路径引用”。见RFC 3986。第4.2节。用作重定向的绝对URL是使用生成的:在本例中给出


当您想要指定主机但不知道用户代理是否使用http或https,并且传递给重定向的字符串为“//host:port/contextpath/servletpath/pathinfo”时,通常使用网络路径引用生成重定向。Servlet规范3.0及更早版本的严格解释不允许使用网络路径引用进行重定向。Servlet 3.1将允许它们,Tomcat 7的最新版本也允许它们用于Servlet 3.0及更早版本。

有人尝试过在Servlet映射器中放入完全限定的域名吗?我想我可以试试……问题在于你是如何构造重定向的,但是因为你没有向我们展示代码,所以不可能告诉你你做错了什么。很简单,给我一点时间,我会发布有用的apache配置,但不是我要求的。我问com.me.util.WelcomeServletPublic是如何根据您提供的参数构造重定向的。哦,糟糕,您是对的,welcomeservlet正在向URL添加一个附加的/。这就是把重写搞得一团糟的原因,它现在似乎正在发挥作用。谢谢