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配置,将http:// url并将其重写为https://。 然后,443监听器接受请求并将其转储到mod_jk,该请求通过端口8009将请求重定向到tomcat。tomcat运行大约6个应用程序,每个应用程序都在它自己的虚拟主机中。

我从来不需要像这样做一个配置,也不知道在哪里解决这个问题。 我知道我不能在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>


~

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

通过为重定向添加一个额外的'/',用于重定向的路径是//login/login.action

虽然正确的名称是“网络路径引用”,但这种类型的URL通常被称为“协议相关”URL。 请参阅RFC 3986。部分4.2。 用作重定向的绝对URL是使用<current-protocol>生成的:<network-path reference>,在这种情况下,http://login/login.action

网络路径引用通常用于在指定主机时生成重定向,但不知道用户代理是使用http还是https,传递给重定向的字符串是“// host:port / contextpath / servletpath / PATHINFO”。 对Servlet规范3.0及更早版本的严格解释不允许使用网络路径引用来进行重定向。 Servlet 3.1将允许它们和最新版本的Tomcat 7允许它们用于Servlet 3.0以及更早版本。


上面的https://stackoverflow.com/users/1299005/mark-thomas评论是问题所在。 我的welcomeservlet正在为url添加一个/这是什么搞乱了我的重写。

链接地址: http://www.djcxy.com/p/89063.html

上一篇: Tomcat redirect taking user outside the domain

下一篇: Configure Apache SSL and then redirect to Tomcat with mod