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>
        <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 , 它失去了域名

现在让我想知道它哪里出了问题的最重要的事情是我的生产服务器是如何配置的。

在前门,我有运行 mod_jk 的 apache。有两个监听器,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 虚拟主机配置

    <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 通常被称为“协议(protocol)相关”URL,尽管正确的名称是“网络路径引用”。请参阅 RFC 3986 第 4.2 节。用作重定向的绝对 URL 是使用 : 生成的,在本例中为 http://login/login.action

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

关于apache - Tomcat 重定向将用户带到域外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10485987/

相关文章:

tomcat CATALINA_HOME 环境变量问题

Apache2 在同一台服务器上托管两个站点

php - Windows 上 filemtime() 的已知问题 - 文件被任意触摸?

jsp - 如何安装JSTL?绝对uri : http://java. sun.com/jsp/jSTL/core无法解析

java - 在 web.xml 中定义正确的资源路径?

HTTP 状态 902 - 没有这样的对话

python - 如何检查哪个 Python 解释器用于在 apache2 中运行 WSGI 脚本?

php - 在 mod_rewrite 之后获取变量

java - slf4j 升级绑定(bind)更新错误?不兼容的绑定(bind)

java - Tomcat - 单击 Web 服务获取 "The requested resource is not available"