0

为新客户启动新网站。他们的旧网站有大约 50 种产品,不幸的是,旧产品名称与新 URL 模式不匹配

旧网址示例:

example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription

example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123

example.com/products.aspx?category=Bar&product=ProductCategoryProdNameRandomNumbers

(旧网址有时会达到 150 多个字符。)

新网址:

example.com/products/category/actual-product-name

从旧产品名称到新产品名称没有固定的、可识别的模式。有类别。

我尝试过简单的 mod_alias 重定向,但知道我需要一个 RewriteRule。但我遇到了问题。我只需要对这 50 个 URL 中的每一个进行一对一的重定向。我以为我可以做类似的事情:

RewriteRule ^/products.aspx?category=Foo&product=ProductName
    /products/category/new-product-name/  [R=301,NC]

但这行不通。我知道这应该很简单,但我被卡住了。有任何想法吗?

4

3 回答 3

1

对其余的重定向 URL 使用下面的模式。请注意,您可以通过在它们前面添加 a来转义特殊字符,例如?, .和空格\

RewriteEngine on
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /products\.aspx\?category=Foo&product=SuperLongNoBreakProductNameIDDescription [NC]
RewriteRule ^ /products/category/new-product-name/  [R=301,NC]
于 2012-01-23T17:26:55.813 回答
0

看看 的RewriteMap指令mod_rewrite

您可以在文本文件中指定如下内容:

products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name

在你的httpd.conf

RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]

提示:如果它是您想要的永久重定向,请确保设置适当的Cache-ControlExpires头来指示浏览器缓存 301。

于 2012-01-23T17:23:28.720 回答
0

你可以尝试这样的事情:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$

RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]

笔记:

  1. 在 per-dir (.htaccess) 上下文中,per-dir 前缀被剥离,因此您不能RewriteRule^/.

  2. 您必须使用RewriteCond来匹配查询字符串。

  3. 如另一个答案中所述RewriteMap,如果您有权访问 httpd.conf /此站点的 vhost 定义,则解决方案可能适合这种情况。我不确定它如何与查询字符串一起使用。

  4. 对于这样的事情,将所有这些 URL 重写为服务器端脚本并使用该脚本为每个 URL 执行 HTTP 重定向可能是一个更好的解决方案。

于 2012-01-23T17:27:02.130 回答