2

我有一个要为其设置购物车的 Web 应用程序;该应用程序服务于许多不同的网站,每个网站都有自己的域。虚拟主机用于将每个域转发到 Tomcat 6 服务器以及设置特定网站静态资源的路径;这些静态资源不能存储在 Web 应用程序中,因此存储在服务器上并通过 Apache 提供服务。

首先我在上下文根上使用 JkMount,然后使用 [P, L] 重写 URL 以从 URL 中取出上下文路径“mywebapp”,因此当有人使用somedomain.comWeb 应用程序处理的域somedomain.com/mywebapp/store/cart 但浏览器访问此应用程序时看到somedomain.com/store/cart。到目前为止,这一直运作良好;问题是每个请求都在重置会话,我不知道为什么。

如果我从服务的前端删除 apache,则 Session 不会重置并且可以正常工作(如我所料)。但我似乎无法将我的虚拟主机设置为在不丢失会话的情况下转发到应用程序。我已经阅读了很多关于这个问题的信息,但我的能力是 JavaEE,而且我对 Apache Web Server 知之甚少;所以我什至不确定如何开始研究修复。

我听说过一种叫做 ProxyPassing 的东西,但我不确定它是什么意思或它是如何工作的;我见过的大多数示例都对 Tomcat server.xml 添加域进行了更改,但我无法真正做到这一点,因为域(要匹配的虚拟主机)是动态添加的,我可以重新启动 Apache,但不能重新启动 JavaEE每次添加新站点时应用程序。

解决这个问题或找到根本原因的任何想法?任何替代方法?

UDPATE:我将发布我的一个动态网站的虚拟主机条目

    <VirtualHost *:80>
    ServerAdmin test@test.com
    DocumentRoot "C:/wamp/www"
    ServerName jawesome.com
    ServerAlias www.jawesome.com
    ErrorLog "logs/jawesome_com-error.log"
    CustomLog "logs/jawesome_com-access.log" common

    Alias /files/ "C:/static/1/uploaded_files/"
    <Directory "C:/static/1/uploaded_files">
                Options FollowSymLinks Indexes MultiViews
                Order allow,deny
                Allow from all
    </Directory>

    JkMount /webapp ajp13
    JkMount /webapp/* ajp13

    RewriteEngine on
    #RewriteLogLevel 9
    #RewriteLog "/usr/local/apache/logs/testrewrite.log"

    RewriteCond %{REQUEST_URI} !^/(webapp/.*|files/.*)$
    RewriteRule ^/(.*)$ /webapp/$1 [P,L]
</VirtualHost>
4

2 回答 2

2

Path需要从 JSESSIONID cookie 中删除。一种选择是在 Tomcat 设置中将其删除。添加emptySessionPath="true"到您的 AJP 连接器。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" emptySessionPath="true"/>

唯一的问题是,如果您在同一域上运行其他应用程序,他们将共享此会话 ID。但是我在您的配置中看不到任何内容。

于 2011-03-08T14:15:02.570 回答
0

我在一个管理多个 java webapps 的团队中,每个 webapps 都有自己的身份验证机制。我们有几个负载平衡的 apache 服务器,我们正在使用 ProxyPass 将流量引导到后端 webapps。到目前为止,ProxyPass 运行良好。

这是一个示例,它将代理传入和传出在 tomcat 服务器上运行的“mywebapp”的请求。

<VirtualHost *:80>
ServerName somedomain.com
    ProxyRequests Off
<Proxy *>
    Order deny,allow
        Allow from all
</Proxy>

ProxyPass /mywebapp http://tomcat-server:8080/mywebapp
ProxyPassReverse /mywebapp http://tomcat-server:8080/mywebapp
<Location />
    Order allow,deny
    Allow from all
</Location>
...
# can put rewrite rules here
...
</VirtualHost>

我们还使用重写规则,它们可以很好地与像这样的 proxypass 定义一起使用。

希望这有帮助,祝你好运。

于 2011-03-08T02:01:27.790 回答