.htaccess中的RegEx删除URL的重复部分

时间:2014-11-26 10:42:37

标签: regex apache .htaccess mod-rewrite

如果网址直接复制,我希望能够删除部分网址。

例如,我有以下网址:

http://www.example.com/foo-bar/
http://www.example.com/foo-bar/foo-bar-1/
http://www.example.com/foo-bar/foo-bar-2/0000-0000/
http://www.example.com/foo-bar/foo-bar-bar/foo/
http://www.example.com/foo-bar/foo-bar-foo/foo/bar/
http://www.example.com/foo-bar/foo-bar-foobar/foo/0000-0000/bar/

我希望只有在URL的下一部分出现“foo-bar”时才从URL中删除第一个“foo-bar”。所以我最终会得到这些网址:

http://www.example.com/foo-bar/
http://www.example.com/foo-bar-1/
http://www.example.com/foo-bar-2/0000-0000/
http://www.example.com/foo-bar-bar/foo/
http://www.example.com/foo-bar-foo/foo/bar/
http://www.example.com/foo-bar-foobar/foo/0000-0000/bar/

我使用RegExr测试以下RegEx:

([a-zA-Z]+[^/]*)\W+\1-

选择除第一个URL之外的所有URL,因为它没有“foo-bar”的重复。

然后我把它放入RewriteCond和RewriteRule:

RewriteCond %{REQUEST_URI} ([a-zA-Z]+[^/]*)\W+\1-
RewriteRule [a-zA-Z]+[^/]* http://%{HTTP_HOST}/$1 [L,R=301]

并通过以下网址上的'htaccess tester'进行测试:

http://www.example.com/foo-bar/foo-bar-foobar/foo/0000-0000/bar/

被改写为:

http://www.example.com/foo-bar-foobar/foo/0000-0000/bar/

但是,当我将此代码放入我的.htaccess文件并访问其实际重定向到的URL时:

http://www.example.com/

然后我回过头来看看RewriteRule和我用过的RegEx:

[a-zA-Z]+[^/]*

当我通过RegExr运行时,我意识到它选择的不仅仅是第一个“foo-bar”。

我相信这是我陷入困境的地方,因为我无法找出只选择第一个“foo-bar”的RegEx。我试过寻找一个解决方案,我试过调整一些人给以下问题的答案,但无济于事:

RewriteCond RewriteRule for .htaccess based on URL to a new page, regular expression

Regex to find text between second and third slashes

我希望我能够很好地解释自己。有任何问题请询问。

提前谢谢你,
克里斯。

1 个答案:

答案 0 :(得分:0)

您可以在根.htaccess中使用此基于前瞻的规则:

RewriteEngine On

RewriteRule ^([^/]+)/((?=.*?\1).+)$ /$2 [L,R=302,NE]