mod_rewrite:用破折号替换下划线

时间:2009-08-14 19:17:37

标签: regex mod-rewrite

我在这里揭露了我对REGEX-fu的尴尬无知,但是:我目前有一个网站,其中文章的URL被写为“article_name”,而较新的URL被写为“article-name”

我想将所有这些都移到使用破折号,那么是否有一个正则表达式可用于将较旧的URL重写为较新的等价物?

提前感谢你!

5 个答案:

答案 0 :(得分:22)

首先,您必须在现有网址中实现一致性。基本上,您必须将所有现有名称规范化以始终使用破折号。好的,你已经完成了。

我们从以下假设开始:

网址大致为:

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

只应重写/articles下的网址,并且只需要对/faulty_article_name部分进行清理。

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

对于Apache:

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

这通常受到了GApple答案的启发。

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

然后我添加了articles/部分,以确保规则仅适用于/articles中的网址。

然后,虽然我们在URL中至少有两个下划线,但我们会继续循环规则。当我们最终只有一个剩下的下划线时,第二个规则开始,用短划线替换它,并进行永久重定向。

呼。

答案 1 :(得分:13)

试试这个:

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

第一条规则一次替换一个下划线,直到剩下一个或更少。最后一条规则将替换最后一个下划线并进行外部重定向。

答案 2 :(得分:2)

一种潜在的不同思考方式:

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

例如:

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

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

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

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

将任何内容与_匹配并通过重定向器发送。

在redirector.php内部,您可以获取$_SERVER['REQUEST_URI']并使用preg_replace等工具甚至数据库查询来查找正确的URL以将其重定向到 - 以及研究旧网址的点击次数。

答案 3 :(得分:1)

mod重写如何知道实际的url应该是什么?您可以重写所有文章以使用下划线或短划线,但mod_rewrite无法判断新位置是否存在。

例如,

/I_Like_Bees      is stored as   /path/i_like_bees
/I-like-flowers   is stored as   /path/i-like-flowers

您希望i-like-bees重写为i_like_bees

  • 如果您将下划线重写为短划线,则无法找到i_like_bees
  • 如果您将破折号重写为下划线i-like-flowers将无法找到

如果您一直存储所有文章,您可以轻松地重写规则。相反,您可能必须编写一个脚本来检查目录是否存在并执行301重定向到正确的位置。

答案 4 :(得分:1)

以下是一种方法:http://yoast.com/apache-rewrite-dash-underscore/

基本上它将url分隔为下划线两侧的标记,并在替换下划线的情况下再次重写标记。问题是它一次只能替换一个下划线;它将重定向到更近但不太正确的网址,这将再次重定向到更接近,但可能仍然不正确的网址...

它建议通过具有多个重写条件来修复多个重定向。规则连续更多的下划线和标记,但这需要你最长标题中强调的条件和规则。

如果可以,请确保添加任何限定符,因为规则可能会替换您不想更改的路径(例如,图像文件)。