我在这里揭露了我对REGEX-fu的尴尬无知,但是:我目前有一个网站,其中的文章的网址负载写为“article_name”,而较新的写为“article-name”。我想把所有的URL都换成破折号,那么有没有一个正则表达式可以用来把旧的URL重写成新的URL?提前感谢您!
hxzsmxv21#
首先,你必须在现有的URL中实现一致性。基本上,你必须规范化所有现有的名称,使其始终使用破折号。好了,你已经做到了。我们从以下假设开始:URL的格式大致如下:
http://example.com/articles/what-ever/really-doesnt_matter/faulty_article_name
其中只有/articles下的URL应该被重写,并且只有/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。然后,当我们在URL中至少有两个下划线时,我们继续循环规则。当我们最终只剩下一个下划线时,第二个规则启动,用破折号替换它,并进行永久重定向。呼。
/?
.htaccess
articles/
xurqigkl2#
试试这个:
RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N] RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]
第一条规则一次替换一个下划线,直到剩下一个或更少。最后一条规则将替换最后一个下划线并进行外部重定向。
5us2dqdw3#
一个潜在的不同的方法来思考:我假设你的“旧格式”和你的“新格式”将在不同的目录中,如果他们不是你可能要考虑使新格式有一个不同的目录名称。例如:
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可以寻找这样的东西:
redirector.php
RedirectRule /articles/(.*_.*) /redirector.php?article=$1
将任何内容与_匹配并通过重定向器发送。在redirector.php中,你可以得到$_SERVER['REQUEST_URI'],并使用preg_replace等工具,甚至数据库查询来找到正确的URL来重定向它们-以及研究旧URL的点击量。
_
$_SERVER['REQUEST_URI']
iqjalb3h4#
mod rewrite如何知道实际的url应该是什么?你可以重写所有的文章,使用下划线或破折号,但mod_rewrite没有办法告诉新的位置是否存在。比如说
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_bees
i-like-flowers
如果你一致地存储你所有的文章,你可以很容易地使重写规则起作用。相反,你可能需要写一个脚本来检查目录是否存在,并做一个301重定向到正确的地方。
yi0zb3m45#
我只是想把这个规则应用到目录/episodes/listen/下的剧集标题中。旧URL:https://example.com/episodes/listen/2_episode_1/index.php所需URL:https://example.com/episodes/listen/2-episode-1/index.php
RewriteEngine On RewriteRule ^(/?episodes/listen/[^_]*)_([^_]*_.*)$ $1-$2 [N,DPI] RewriteRule ^(/?episodes/listen/[^_]*)_([^_]*)$ [L,R=301]
58wvjzkj6#
这里有一个方法:http://yoast.com/apache-rewrite-dash-underscore/基本上,它将URL分隔成下划线两边的标记,然后用替换掉的下划线再次重写标记。它将重定向到一个更接近但不完全正确的URL,这将再次重定向到一个更接近,但可能仍然不正确的URL…它建议通过设置几个重写条件来修复多个重定向,这些重写条件和规则具有连续更多的下划线和标记,但这需要与最长标题中的下划线一样多的条件和规则。但是,如果可以的话,请确保添加任何限定符,因为该规则可能会替换您不希望更改的路径(例如,图像文件)。
6条答案
按热度按时间hxzsmxv21#
首先,你必须在现有的URL中实现一致性。基本上,你必须规范化所有现有的名称,使其始终使用破折号。好了,你已经做到了。
我们从以下假设开始:
URL的格式大致如下:
其中只有
/articles
下的URL应该被重写,并且只有/faulty_article_name
部分需要被清理。大更新,有实际工作的东西
对于Apache:
这基本上是受到了GApple的回答的启发。
第一个
/?
确保此代码将在vhost confs和.htaccess
文件上运行。后者不需要前导斜杠。然后添加
articles/
部分,以确保规则仅适用于/articles
中的URL。然后,当我们在URL中至少有两个下划线时,我们继续循环规则。当我们最终只剩下一个下划线时,第二个规则启动,用破折号替换它,并进行永久重定向。
呼。
xurqigkl2#
试试这个:
第一条规则一次替换一个下划线,直到剩下一个或更少。最后一条规则将替换最后一个下划线并进行外部重定向。
5us2dqdw3#
一个潜在的不同的方法来思考:
我假设你的“旧格式”和你的“新格式”将在不同的目录中,如果他们不是你可能要考虑使新格式有一个不同的目录名称。
例如:
在这种情况下,您可以使用mod_rewrite来检测“旧目录”中的任何内容,并将其重定向到“
redirector.php
”。虽然仔细想想,你的mod_rewrite可以寻找这样的东西:
将任何内容与
_
匹配并通过重定向器发送。在redirector.php中,你可以得到
$_SERVER['REQUEST_URI']
,并使用preg_replace等工具,甚至数据库查询来找到正确的URL来重定向它们-以及研究旧URL的点击量。iqjalb3h4#
mod rewrite如何知道实际的url应该是什么?你可以重写所有的文章,使用下划线或破折号,但
mod_rewrite
没有办法告诉新的位置是否存在。比如说
您希望
i-like-bees
重写为i_like_bees
。i_like_bees
i-like-flowers
不会被发现如果你一致地存储你所有的文章,你可以很容易地使重写规则起作用。相反,你可能需要写一个脚本来检查目录是否存在,并做一个301重定向到正确的地方。
yi0zb3m45#
我只是想把这个规则应用到目录/episodes/listen/下的剧集标题中。
旧URL:https://example.com/episodes/listen/2_episode_1/index.php
所需URL:https://example.com/episodes/listen/2-episode-1/index.php
58wvjzkj6#
这里有一个方法:http://yoast.com/apache-rewrite-dash-underscore/
基本上,它将URL分隔成下划线两边的标记,然后用替换掉的下划线再次重写标记。它将重定向到一个更接近但不完全正确的URL,这将再次重定向到一个更接近,但可能仍然不正确的URL…
它建议通过设置几个重写条件来修复多个重定向,这些重写条件和规则具有连续更多的下划线和标记,但这需要与最长标题中的下划线一样多的条件和规则。
但是,如果可以的话,请确保添加任何限定符,因为该规则可能会替换您不希望更改的路径(例如,图像文件)。