Apache 简单的mod#u重写规则,用于凌乱的旧url';s
为新客户启动新网站。他们的旧站点有大约50个产品,不幸的是,旧的产品名称与新的URL模式不匹配 旧URL示例:Apache 简单的mod#u重写规则,用于凌乱的旧url';s,apache,.htaccess,mod-rewrite,mod-alias,Apache,.htaccess,Mod Rewrite,Mod Alias,为新客户启动新网站。他们的旧站点有大约50个产品,不幸的是,旧的产品名称与新的URL模式不匹配 旧URL示例: example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123 example.com/products.a
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_别名重定向,但我知道我需要一个重写规则。但我有问题。我所需要的只是对这50个URL中的每一个进行1对1的重定向。我想我可以做一些类似的事情:
RewriteRule ^/products.aspx?category=Foo&product=ProductName
/products/category/new-product-name/ [R=301,NC]
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name
但这是行不通的。我知道这应该很简单,但我被卡住了。有什么想法吗?看看的
RewriteMap
指令
可以在文本文件中指定以下内容:
RewriteRule ^/products.aspx?category=Foo&product=ProductName
/products/category/new-product-name/ [R=301,NC]
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]
提示:如果这是您想要的永久重定向,请确保设置适当的
缓存控件
和过期
标题,以指示浏览器缓存301。对其余重定向URL使用以下模式。请注意,通过在特殊字符前面添加一个\
来转义它们,例如?
、
和空格
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]
您可以尝试以下方法:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
注:
^/
启动重写规则
模式RewriteCond
来匹配查询字符串RewriteMap
解决方案可能适合这种情况。不过,我不确定这是如何处理查询字符串的为了保持良好的状态,您可能应该避开这段时间,例如
products\.aspx
。另外,请参阅下面关于RewriteCond的答案。在.htaccess中是否有其他重写规则会影响重写的URL?您可能希望在执行外部重定向时使用L
标志。感谢JMM的响应。没有其他重写规则。站点的其余部分可以通过简单的重定向来处理。也没有外部重定向。您没有说明是否具有根配置访问权限,是否在vhost配置中或使用基于.htaccess
的规则进行这些重写。因为如果后者为真,则映射不起作用,并且您的regexp是错误的:每个dir regexps没有前导/开。@TerryE-很抱歉说得含糊不清。这是在vhost中完成的,而不是在.htaccess文件中。请将此与Ulrich的解决方案结合起来,因为路径不包含查询字符串。+1感谢您没有使用明显(更复杂)的%{QUERY\u STRING}
感谢您的回复。这是可行的,但url有一个令人费解的问题。它显示为:/products/category/new product name/?category=Foo&product=superlong…
不是一个交易破坏者,但令人费解。另外,我没有使用RewriteBase,因为我必须直接将其放入vhost中。@u zero在末尾添加一个?
以抑制原始查询字符串,即RewriteRule^/products/category/new product name/?[R=301,NC]
就是这样做的。有时我问一些愚蠢的问题,我也应该知道答案@乌尔里希·帕哈非常感谢你的帮助。还有一个问题-如果我有50个这样的问题,它会引起任何问题吗?@u-zero可能会在不知不觉中变慢,但不会引起问题