mod_rewrite:用短划线replace下划线

我在这里透露了我对REGEX-fu的尴尬无知,但是:我现在有一个网站,其中一些网页的文章URL被写为“article_name”,而较新的则被写为“文章名”。

我想把所有这些移动到破折号,所以有一个正则expression式,我可以用它来重写旧的URL到他们的新的等值?

提前感谢您!

首先,您必须在现有url中保持一致。 基本上,你必须规范所有现有的名字,总是使用破折号。 好的,你已经做到了。

我们从以下假设开始:

该URL大致是这样的forms:

 http://example.com/articles/what-ever/really-doesnt_matter/faulty_article_name

只应该重写/articles下的URL,只有/faulty_article_name部分需要清理。

大大更新,实际上有效的东西

对于Apache:

 RewriteEngine On RewriteRule ^(/?articles/.*/[^/]*?)_([^/]*?_[^/]*)$ $1-$2 [N] RewriteRule ^(/?articles/.*/[^/]*?)_([^/_]*)$ $1-$2 [R=301] 

这通常由GApple的答案启发。

第一个/? 确保这个代码可以在vhost confs和.htaccess文件上运行。 后者并不期待一个主导的斜线。

然后添加articles/部分以确保规则仅适用于/articles URL。

然后,我们在URL中至less有两个下划线,我们不断循环规则。 当我们最后只剩下一个下划线时,第二个规则就开始了,用一个破折号代替它,并做一个永久的redirect。

唷。

尝试这个:

 RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N] RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301] 

第一个规则一次replace一个下划线,直到剩下一个或更less。 最后的规则将取代最后一个下划线,并执行外部redirect。

一个潜在的不同的方法来思考:

我假设你的“旧格式”和你的“新格式”将在这个想法的不同目录,如果他们不是你可能要考虑使新格式有不同的目录名称。

例如:

  http://site.com/articles/2008/12/31/new_years_celebration 
  http://site.com/article/2008/12/31/new-years-celebration 

在这种情况下,您可以使用mod_rewrite来检测“旧目录”中的任何内容,并将其redirect到“ redirector.php ”。

虽然第二个想法,您的mod_rewrite可能会寻找这样的东西:

  RedirectRule /articles/(.*_.*)/redirector.php?article=$1 

_匹配任何内容并通过redirect器发送。

在redirector.php里面,你可以得到$_SERVER['REQUEST_URI']并使用像preg_replace甚至数据库查询这样的工具来find正确的URL来redirect它们 – 以及研究到旧URL的命中次数。

如何将mod重写知道实际的url应该是什么? 你可以重写所有的文章来使用下划线或破折号,但mod_rewrite没有办法确定是否存在新的位置。

例如,

 / I_Like_Bees被存储为/ path / i_like_bees
 / I-like-flowers存储为/ path / i-like-flowers

你想要i-like-bees重写为i_like_bees

  • 如果您重写下划线,将不会findi_like_bees
  • 如果你重写破折号强调i-like-flowers不会被发现

如果您一直存储所有文章,则可以轻松地制定重写规则。 相反,你可能必须编写一个脚本来检查目录的存在,并做301redirect到正确的地方。

这里有一个方法:http: //yoast.com/apache-rewrite-dash-underscore/

基本上它将url分成下划线两侧的标记,并且用下划线replace再次重写这些标记。 问题是它一次只replace一个下划线。 它会redirect到一个更接近但不太正确的url,这将再次redirect到更接近,但可能仍然不正确的url…

它build议通过多次重写条件和规则来修复多个redirect,并且有更多的下划线和标记,但是这需要尽可能多的条件和规则,就像你在最长的标题中所强调的那样。

但是,如果可以,请确保添加了限定符,因为规则可能会按原样replace您不想更改的path(例如,图像文件)。