提问者:小点点

Tomcat重定向将用户带到域外


我的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>

在我的开发环境中,这个重定向工作得很好。现在一切都移入我的正式生产环境,这个重定向不工作。

应该发生的是当你去https://mydomain.com它会将你重定向到https://mydomain.com/login/login.action

发生的事情是它重定向到https://login/login. action,它丢失了域名

现在让我想知道哪里出了问题的是我的正式服是如何配置的。

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

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

这是我的apache vhost配置

    <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>


~

共2个答案

匿名用户

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

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

这种类型的URL通常被称为“协议相对”URL尽管正确的名称是“网络路径引用”。参见RFC3986。第4.2节。用作重定向的绝对URL是使用

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

匿名用户

https://stackoverflow.com/users/1299005/mark-thomas上面的评论是问题所在。我的wecomeservlet正在添加一个额外的/到url,这就是搞砸我重写的原因。