简单的 mod_rewrite RewriteRule 用于处理混乱的遗留 url
-
12-11-2019 - |
题
为新客户推出新网站。他们的旧网站有大约 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
(旧 URL 有时会达到 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]
但这是行不通的。我知道这应该很简单,但我被困住了。有任何想法吗?
解决方案
对于其余的重定向网址,请使用以下模式。请注意,您要转义特殊字符,例如 ?
, .
和空间 通过添加一个
\
在他们面前
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]
其他提示
看看 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-Control
和 Expires
标头指示浏览器缓存 301。
你可以尝试这样的事情:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
笔记:
在每个目录 (.htaccess) 上下文中,每个目录前缀被删除,因此您无法启动
RewriteRule
图案与^/
.你必须使用
RewriteCond
与查询字符串进行匹配。正如另一个答案中所说,
RewriteMap
如果您有权访问该站点的 httpd.conf / vhost 定义,则解决方案可能适合这种情况。但我不确定它如何与查询字符串一起使用。对于这样的事情,将所有这些 URL 重写到服务器端脚本,并使用该脚本对每个 URL 进行 HTTP 重定向可能是更好的解决方案。