这个问题令人抓狂,我希望有人能指出我正确的方向。
我正在尝试将 Redmine 的实例部署到 Jetty servlet。我已经使用 Warbler 创建了战争,创建了上下文,并且它似乎正在部署。不幸的是,我看到以下行为:
如果我在其配置的主机名 / 访问我的应用程序,我会看到 webapp 目录的目录列表。
如果我通过向 /braillewizard(上下文名称)发送 GET 请求并发送配置的主机名来访问该应用程序,则该应用程序将运行。
如果我向 /braillewizard 发送一个带有 Host: 标头的请求,该标头未包含在主机名列表中,则该应用程序不会运行并且我得到一个 404。
所以看起来我已经正确配置了部分虚拟主机,但有些地方不太正确。特别烦人的事情是,我在另外两个系统上运行了类似的设置,包括一个运行 Redmine 的系统,并且一切正常。
对于这个系统,我能想到的唯一区别是我为系统的 FQDN 设置了一个虚拟主机,而在其他系统上,主机位于附带域上。不确定这是否是一个因素,但我尝试摆脱上下文配置并使用 /root 中的应用程序似乎仍然需要 /root 的 GET。
我还直接远程登录到 Jetty 服务器,所以这不是我的前端 Web 服务器的问题。
这是我的上下文配置:
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="war"><SystemProperty name="jetty.home"/>/webapps/braillewizard.war</Set>
<Set name="contextPath">/</Set>
<Set name="virtualHosts">
<Array type="java.lang.String">
<Item>braillewizard.org</Item>
<Item>www.braillewizard.org</Item>
</Array>
</Set>
</Configure>
还有我的 web.xml,由 Warbler 生成:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>rails.env</param-name>
<param-value>production</param-value>
</context-param>
<context-param>
<param-name>public.root</param-name>
<param-value>/</param-value>
</context-param>
<filter>
<filter-name>RackFilter</filter-name>
<filter-class>org.jruby.rack.RackFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RackFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.jruby.rack.rails.RailsServletContextListener</listener-class>
</listener>
</web-app>
如果还有什么我可以提供的,请告诉我。我一直在谷歌搜索几个小时的解决方案,但没有找到任何东西。
编辑:好的,这里有更多细节。/context 有效的想法并不完全正确。相反,该应用程序无法加载,并且由于某种原因我看不到异常。后来进行了各种调整,问题似乎略有不同。
似乎 / 没有运行 Rails 应用程序中附加到 / 的任何路由。相反,它触发了 webapp 文件夹的目录列表。如果我直接访问我的应用程序中的 URL,除了 / 当然,一切似乎都运行良好。
使用 -DDEBUG 作为 JVM 参数调用 Jetty 似乎表明 RackHandler 被击中,然后进入默认处理程序。这似乎与未运行的处理程序一致,但我不确定为什么我在此部署的一个版本而不是另一个版本中看到该行为。