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
。
- 如果您重写下划线,将不会find
i_like_bees
- 如果你重写破折号强调
i-like-flowers
不会被发现
如果您一直存储所有文章,则可以轻松地制定重写规则。 相反,你可能必须编写一个脚本来检查目录的存在,并做301redirect到正确的地方。
这里有一个方法:http: //yoast.com/apache-rewrite-dash-underscore/
基本上它将url分成下划线两侧的标记,并且用下划线replace再次重写这些标记。 问题是它一次只replace一个下划线。 它会redirect到一个更接近但不太正确的url,这将再次redirect到更接近,但可能仍然不正确的url…
它build议通过多次重写条件和规则来修复多个redirect,并且有更多的下划线和标记,但是这需要尽可能多的条件和规则,就像你在最长的标题中所强调的那样。
但是,如果可以,请确保添加了限定符,因为规则可能会按原样replace您不想更改的path(例如,图像文件)。