简单的mod_rewrite RewriteRule用于凌乱的遗留URL

时间:2012-01-23 17:09:43

标签: apache .htaccess mod-rewrite mod-alias

为新客户启动新网站。他们的旧网站有大约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中的每一个的1对1重定向。我以为我可以这样做:

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

但这不起作用。我知道这应该很简单,但我被困住了。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

将以下模式用于其余的重定向网址。请注意,您转义特殊字符,例如?.和空格在他们面前添加\

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]

答案 1 :(得分:0)

查看mod_rewriteRewriteMap指令。

您可以在文本文件中指定:

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。

答案 2 :(得分: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. 如另一个答案所述,如果您可以访问此站点的httpd.conf / vhost定义,RewriteMap解决方案可能适合这种情况。我不确定如何使用查询字符串。

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