Apache 301重定向重写规则以用连字符替换下划线并删除子目录

Apache 301重定向重写规则以用连字符替换下划线并删除子目录,apache,.htaccess,redirect,mod-rewrite,url-rewriting,Apache,.htaccess,Redirect,Mod Rewrite,Url Rewriting,我需要帮助为.httaccess文件夹中的以下链接结构创建重写规则/301重定向 源URL:www.example.com/sub_directory/product_name_1.html 目标URL:www.example.com/prodcut-name-1.html 重定向的要求如下: 删除/sub_目录/ 将所有下划线'.'更改为连字符'-' 不幸的是,我的正则表达式不是很好。我试着四处搜索,但其他帖子中的解决方案与我不适用的类似问题(例如) 如果您能提供解决方案,我们将不胜感激。

我需要帮助为.httaccess文件夹中的以下链接结构创建重写规则/301重定向

源URL:www.example.com/sub_directory/product_name_1.html

目标URL:www.example.com/prodcut-name-1.html

重定向的要求如下:

  • 删除/sub_目录/
  • 将所有下划线'.'更改为连字符'-'
不幸的是,我的正则表达式不是很好。我试着四处搜索,但其他帖子中的解决方案与我不适用的类似问题(例如)

如果您能提供解决方案,我们将不胜感激。另外,如果你能解释一下原因/方式。我希望能够更好地理解这一点。

类似这样的事情

RewriteEngine on
RewriteBase /
RewriteRule ^(sub_directory/[^_]*)_+(.*) $1-$2 [DPI,N]
RewriteRule ^sub_directory(?:$|/(.*)) http://%{HTTP_HOST}/$1 [R=301,L]
它首先循环该子目录中的URL,用一个连字符替换连续的下划线。它首先完成,这样就不会干扰可能包含下划线的其他URL。然后从外部将该子目录的(已清理的)请求重定向到根目录。丑陋分组确保它仅适用于该文件夹。

已关闭,但需要一些更改,例如正则表达式锚定和
DPI
标志

您可以在站点根目录顶部使用这些规则。htaccess:

RewriteEngine On

# remove /sub_directory/ when there is no _ left
RewriteRule ^sub_directory/([^_]+)$ /$1 [R=301,NC,NE,L]

# use recursion based rule to replace _ by -
RewriteRule ^(sub_directory/[^_]*)_+(.*)$ $1-$2 [NC,N,DPI]

# rest of your rules go here

谢谢你的帮助。不幸的是,这不起作用。URL保持不变。尝试将所有下划线更改为连字符也没有效果。也许我们制定的另一条规则是干涉。我们只是将所有请求重定向到这个子域的主产品页面。再次感谢。您在
sub\u目录/htaccess
中已经有一些代码了吗?这是根目录中的.htaccess的代码。该站点已转移到新平台,该目录已不存在。页面结构如上文所述发生了更改。我只是将所有指向该子目录的链接重定向到主产品页面。不客气。没有想过要评论/改进我的答案吗?@Walf,我试过你的答案,但没能成功。然而,我很抱歉,我本应该给你的正则表达式和整体方法(upvtoted now)的信用良好的礼仪是在你的答案中写下你建立在谁的答案上。编辑答案并参考你的答案。还请看一下我的规则中缺少的
DPI
标志,这救了我!!!我不明白为什么在那之前它不起作用。。。