0

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

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

旧 URL 的结构方式是http://www.myurl.com/categoryOLD/article_12345.fixed/this_is_the_title.html

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

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

所以/article_12345.fix/没了,旧的分类改写成新的分类,最后的.html没了,下划线要变成连字符。

我一直在阅读和尝试,但我什至无法让 RewriteCond 匹配。有没有人梦想用正则表达式来帮助我?

4

3 回答 3

1

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

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

将此放置在您的其他规则之前,以便它们与新 URL 一起使用。

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

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

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

于 2013-05-26T10:24:31.757 回答
0

First:RewriteCondition不是必需的(参见http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond),所以可以先尝试直接重写,然后在需要时使用条件来控制比赛流程更好。

类别

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

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]
于 2013-05-26T10:04:15.210 回答
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]

奇迹般有效!谢谢你们的帮助

于 2013-05-27T15:38:37.500 回答