【问题标题】:RegEx in .htaccess remove duplicate part of URL.htaccess 中的正则表达式删除 URL 的重复部分
【发布时间】:2014-11-26 10:42:36
【问题描述】:

如果 URL 本身直接重复,我希望能够删除它的一部分。

例如,我有以下网址:

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/

只有当“foo-bar”出现在 URL 的下一部分时,我才想从 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]

并通过以下 URL 上的“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”的正则表达式。我已尝试寻找解决方案,我已尝试调整人们对以下问题的一些答案,但无济于事:

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

Regex to find text between second and third slashes

我希望我已经充分解释了自己。有任何问题欢迎提问。

提前谢谢你,
克里斯。

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 2015-12-04
      • 2016-10-15
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多