如何创建RewriteCond然后使用.htaccess重写这个困难的URL

时间:2013-05-26 09:51:01

标签: .htaccess mod-rewrite rewrite

在阅读并尝试了几个小时的正则表达式后,我相信是时候寻求帮助..

我们最近通过将旧文章导入另一个CMS和新数据库来迁移了一个相当大的网站。 URL结构完全不同。

旧网址的结构方式为http://wwww.myurl.com/categoryOLD/article_12345.fixed/this_is_the_title.html

说/article_12345.fixed/的部分是所有旧URL中存在的部分,就像最后的.html部分一样。 12345是每个URL的条目ID不同。我相信我们可以使用它来识别需要重写的URL。

旧网址需要重写为http://wwww.myurl.com/categoryNEW/this-is-the-title

所以/article_12345.fix/消失了,旧类别被重写为一个新类别,最后的.html消失了,下划线需要成为连字符。

我一直在阅读和尝试,但我甚至无法让RewriteCond匹配。有没有人在正则表​​达式中做梦,可以帮助我在这里?

3 个答案:

答案 0 :(得分:1)

要将下划线重写为连字符,可以使用RewriteRule的[N]标志。

RewriteRule ^([^_]+)_(.*) $1-$2 [N,DPI]

将其放在其他规则之前,以便使用新网址。

然后重写其余部分的RewriteRule可能如下所示:

RewriteRule ^\/?(.*?)\/(.*?)\/(.*)\.html$ $1/$3

这只是基本的重写,对于基于ID的重写,RewriteMap可能是Max Leske所提到的最佳解决方案。

答案 1 :(得分:0)

首先:RewriteCondition不是必需的(请参阅http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond),因此可以先尝试直接重写,如果需要,稍后再使用条件,以便更好地控制匹配流程。

类别

我会使用rewrite map重写您的类别,因为您可能需要每个类别一个条目,除非您可以提出转换规则。

ID

在匹配组中包含id,并且不要在输出中使用该组:
RewriteRule ^/.*/(<regex for id>/)(.*)$ http://myurl.com$2(仅使用第二个匹配组)

的.html

与id相同:请勿使用.html

的匹配项

把它放在一起

所以你的config / .htaccess看起来像这样:

RewriteEngine On
RewriteMap examplemap txt:/path/to/file/map.txt
RewriteRule ^/.*/([\w\d]+/)(.*)$ ${examplemap:$2}

RewriteRule ^/.*/([article_[\d]+\.fix)(.*)$ http://myurl.com$2
RewriteRule ^/(.*/)(\w+)_(\w+)(.*)$ http://myurl.com$1$2-$3 [N]

答案 2 :(得分:0)

我最终使用了以下内容:

RewriteEngine On
RewriteRule ^([^_]+)__(.*)\.html$ $1_$2.html [N,DPI]
RewriteRule ^([^_]+)_(.*)\.html$ $1-$2.html [N,DPI]
RewriteRule ^(.*)cat1old/(.*)\.html$ $1cat1new/$2.html
RewriteRule ^(.*)cat2old/(.*)\.html$ $1cat2new/$2.html
RewriteRule ^(.*)cat3old/(.*)\.html$ $1cat3new/$2.html
RewriteRule ^(.*)cat4old/(.*)\.html$ $1cat4new/$2.html
RewriteRule ^\/?(.*)\/(.*)\/(.*)(-?)\.html$ $1/$3 [R=301,L]

像魅力一样!谢谢你的帮助