regex mod_rewrite:用短划线替换下划线

v440hwme  于 2023-04-22  发布在  其他
关注(0)|答案(6)|浏览(123)

我在这里揭露了我对REGEX-fu的尴尬无知,但是:我目前有一个网站,其中的文章的网址负载写为“article_name”,而较新的写为“article-name”。
我想把所有的URL都换成破折号,那么有没有一个正则表达式可以用来把旧的URL重写成新的URL?
提前感谢您!

hxzsmxv2

hxzsmxv21#

首先,你必须在现有的URL中实现一致性。基本上,你必须规范化所有现有的名称,使其始终使用破折号。好了,你已经做到了。
我们从以下假设开始:
URL的格式大致如下:

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中至少有两个下划线时,我们继续循环规则。当我们最终只剩下一个下划线时,第二个规则启动,用破折号替换它,并进行永久重定向。
呼。

xurqigkl

xurqigkl2#

试试这个:

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

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

5us2dqdw

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可以寻找这样的东西:

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

将任何内容与_匹配并通过重定向器发送。
在redirector.php中,你可以得到$_SERVER['REQUEST_URI'],并使用preg_replace等工具,甚至数据库查询来找到正确的URL来重定向它们-以及研究旧URL的点击量。

iqjalb3h

iqjalb3h4#

mod rewrite如何知道实际的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重定向到正确的地方。

yi0zb3m4

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]
58wvjzkj

58wvjzkj6#

这里有一个方法:http://yoast.com/apache-rewrite-dash-underscore/
基本上,它将URL分隔成下划线两边的标记,然后用替换掉的下划线再次重写标记。它将重定向到一个更接近但不完全正确的URL,这将再次重定向到一个更接近,但可能仍然不正确的URL…
它建议通过设置几个重写条件来修复多个重定向,这些重写条件和规则具有连续更多的下划线和标记,但这需要与最长标题中的下划线一样多的条件和规则。
但是,如果可以的话,请确保添加任何限定符,因为该规则可能会替换您不希望更改的路径(例如,图像文件)。

相关问题