为新客户推出新网站。他们的旧网站有大约 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-ControlExpires 标头指示浏览器缓存 301。

你可以尝试这样的事情:

RewriteEngine On

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

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

笔记:

  1. 在每个目录 (.htaccess) 上下文中,每个目录前缀被删除,因此您无法启动 RewriteRule 图案与 ^/.

  2. 你必须使用 RewriteCond 与查询字符串进行匹配。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top