1

我们的 Grails 应用程序部署在 VPS 上,但 www 和非 www 版本并不相同。实际上有两个站点,即浏览器中有两个cookie,每个版本一个,所以非www版本登录的用户没有登录www版本。

在 Grails 中将非 www 版本指向 www 版本的最佳方法是什么?我们使用 Tomcat 作为应用服务器。

我正在考虑创建一个 Grails 过滤器并将所有非 www url 更改为附加 www 的相同 url 并进行永久重定向。但我不确定这是否是一个好方法。我们在 Tomcat 前面没有 Apache 服务器,所以我们不能使用它的 url 重写机制。

谢谢你。

4

2 回答 2

3

您可以访问主要的 Tomcat 配置吗?Tomcat 可以做虚拟主机,所以你可以用一个简单的 webapp 设置一个单独的虚拟主机来做重定向。

conf/server.xml

<Engine name="Catalina" defaultHost="localhost">
  <Host name="localhost" appBase="webapps" ...>
    <!-- current configuration, this Host will serve www.example.com -->
  </Host>

  <Host name="example.com" appBase="nonwww-webapps" />
</Engine>

非www-webapps/ROOT/WEB-INF/web.xml

<?xml version="1.0" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

  <servlet>
    <servlet-name>redirectToWww</servlet-name>
    <jsp-file>/WEB-INF/redirect.jsp</jsp-file>
  </servlet>

  <servlet-mapping>
    <servlet-name>redirectToWww</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

非www-webapps/ROOT/WEB-INF/redirect.jsp

<% response.sendRedirect("http://www.example.com" + request.getRequestURI() +
      (request.getQueryString() == null
          ? ""
          : ("?" + request.getQueryString())
      )); %>

或者,如果您想要 301 而不是 302 重定向

<% response.setStatus(301);
   response.setHeader("Location", "http://www.example.com" + request.getRequestURI() +
      (request.getQueryString() == null
          ? ""
          : ("?" + request.getQueryString())
      ));
   response.setHeader("Connection", "close"); %>
于 2013-01-17T19:11:54.303 回答
0

如果您的 Tomcat 前面没有 Apache 服务器,您可以使用UrlRewriteFilter。一种像 Apache 一样执行 URL 重写的工具,但直接使用 Tomcat(和其他 Web 应用程序服务器)。

于 2013-01-17T18:15:25.600 回答