3

我们正在将基于 JSP 的旧 Web 应用程序移动到 Spring MVC 控制器并使用urlRewriteFilter ( http://tukey.org/urlrewrite/ ) 进行重定向。

我们需要将带有参数的旧 JSP 永久重定向到控制器视图:

FROM: /products/product-detail.jsp?productId=666
TO: /product-detail?id=666

这里重要的是使用type="permanent-redirect",因为我们需要重定向对 SEO 友好。

我看过很多使用 urlRewriteFilter 的示例和帖子,所有这些都是处理不带参数的普通 JSP 的重写,例如 some.jsp 到 /newurl

到目前为止,唯一的成就是使用 forward:

<rule>
    <name>Product Detail Old</name>
    <from>^/products/product-detail.jsp(.*)$</from>
    <to type="forward">/product-detail</to>
</rule>

但这当然根本不会重写 URL:

结果是: /products/product-detail.jsp?productId=666

我们也试过这个,但它不起作用:

<rule>
    <from>/products/product-detail.jsp?(.+)</from>
    <to type="permanent-redirect">/product-detail?$1</to>
</rule>

结果是/product-detail?p

有没有人可以帮助构建一个使用 urlRewriteFilter 满足上述条件的规则?

帮助最受赞赏。

4

3 回答 3

2

它不会自行重写......正如我在手册中发现的那样,<from>它只使用了没有查询字符串的 URL 字符串。为了能够使用查询字符串,我们需要<urlrewrite use-query-string="true">在这之后添加它就像一个魅力!所以最后的规则:

<urlrewrite use-query-string="true">

<!-- more rules here if needed.... -->
<rule>
    <from>^/products/product-detail.jsp\?productId=([0-9])$</from>
    <to type="permanent-redirect">/product-detail?id=$1</to>
</rule>

</urlrewrite>
于 2013-03-29T04:04:06.517 回答
1

下面的工作吗?

<rule>
    <from>/products/product-detail.jsp\?productId=([0-9])</from>
    <to type="permanent-redirect">/product-detail?id=$1</to>
</rule>

编辑

对不起。忘记了问号前面的斜线,这是正则表达式中的保留字符,除非您对其进行转义。

实际上,这让我昨天感到困惑,主要是直接从我们现有的旧 mod_rewrite 规则中复制。

于 2013-03-28T15:54:57.397 回答
1

有几种方法可以解决这个问题。您可以使用

<urlrewrite use-query-string="true">

尽管这会影响文件中的所有规则。要针对特定​​规则定位查询字符串,请使用条件元素

<condition type="query-string">productId=([0-9])</condition>

然后您可以像这样引用查询字符串

<to type="permanent-redirect">/someUrl?%{query-string}</to>

尽管在您的情况下,您希望更改查询字符串,因此您可能希望引用捕获的正则表达式

<to type="permanent-redirect">/product-detail?id=$1</to>
于 2015-07-28T11:07:55.830 回答