一方面,我建议您在应用程序中处理此问题,而不是依赖外部重写,例如通过 Apache mod_rewrite(除非您确定这是最快的方法。)
但首先有几件事:
我不会转换这个:
http://mysite.com/products.jsp?id=42&name=Programming_Book
进入这个:
http://mysite.com/product-Programming-Book
看,如果我只看你的书示例,我看不出以前的 URL 有什么问题。之后,这一切都适用于亚马逊。而且没有像谷歌友好的 URL(只有用户友好的 URL)这样的东西。你必须考虑为什么要进行这种类型的重写,以及如何进行。例如,在您的重写选项中,id 在哪里?
也就是说,你必须定义一个逻辑规则来定义
您要展示的独特页面,以及
可以识别每个页面的唯一参数组合。
例如,使用您的书柜。假设您可以使用以下规则识别任何书籍:
- 国际标准书号
- 按作者姓名、标题和是否
适用版本(如果版本是
缺失,假设是最新的)
- 如果 ISBN 包含在 Author 中
姓名、标题和/或版本,忽略
除了 ISBN。也就是说,对待它
作为前者(或更准确地说,
忽略所有其他书籍标识
存在 ISBN 时的参数。)
使用 ?parametrized url 方案,您将有以下可能性:
http://yoursite/products?isbn=123465
http://yoursite/products?author=johndoe&title="the cookbook" << this assumes the latest edition, or 1 if first.
http://yoursite/products?author=johndoe&title="the cookbook"&edition=3
http://yoursite/products?title="the cookbook"&author=johndoe
http://yoursite/products?edition=3&title="the cookbook"&author=johndoe
....
以此类推,适用于所有组合。因此,在您寻找技术实现之前,您必须非常仔细地考虑您将如何做到这一点。您必须创建语法和参数层次结构(例如,作者总是在标题之前,而标题总是在版本之前)。
因此,您将得到以下结果(使用与作者 John Doe 相同的示例,他的书在第 3 版中):
http://yoursite/product/isbn/12345
http://yoursite/product/author/johndoe/the%20cookbook << see the %20 for encoding spaces (not a good idea, but something to take into account)
http://yoursite/product/author/johndoe/the%20cookbook/3
任何其他组合都应该生成错误或巧妙地找出如何重写为“cannon”版本并使用适当的 URL 目标向客户端发送 HTTP 3xx。
一旦你解决了这些细节,你可以问问自己付出的努力是否值得或必要。
因此,如果您发现自己需要,那么最简单和最便宜的 DIY 方法是编写一个过滤器来解析 url,分解参数,为 JSP 页面创建一个?参数化的 url 字符串,获取它的 RequestDispatcher 并转发给它。
您不想进行 URL 重写,因为这些会在您的服务器和客户端之间来回传输 HTTP 303/307。或者至少您希望将其保持在最低限度。