为新客户启动新网站。他们的旧网站有大约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]
但这不起作用。我知道这应该很简单,但我被困住了。有什么想法吗?
答案 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_rewrite
的RewriteMap
指令。
您可以在文本文件中指定:
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-Control
和Expires
标头,以指示浏览器缓存301。
答案 2 :(得分:0)
您可以尝试这样的事情:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
注意:
在per-dir(.htaccess)上下文中,per-dir前缀被剥离,因此您无法使用RewriteRule
启动^/
模式。
您必须使用RewriteCond
来匹配查询字符串。
如另一个答案所述,如果您可以访问此站点的httpd.conf / vhost定义,RewriteMap
解决方案可能适合这种情况。我不确定如何使用查询字符串。
对于类似这样的事情,将所有这些URL重写为服务器端脚本可能是更好的解决方案,并使用该脚本为每个URL执行HTTP重定向。