如果我尝试将它与 $1、$2 等反向引用一起使用,字符串在 RewriteRule 中重复 20 次。诡异的。为什么?

String repeats 20 times in RewriteRule if i try to use it with $1, $2 etc. back-references. Weird. Why?

我尝试在 .htaccess 中执行 RewriteRule 重定向,其中输出 URL 除了来自捕获组的捕获文本之外还有一些额外的文本。

原文url:https://example.com/places/europe/hungary/budapest/
我的正则表达式模式:^places/([a-zA-Z-_]+/)?([a-zA-Z-_]+/)?([a-zA-Z-_]+/)?

我想在目标 url 中添加一个 'text-' 字符串,大约 $1、$2..

.htaccess 中的完整行:RewriteRule ^places/([a-zA-Z-_]+/)?([a-zA-Z-_]+/)?([a-zA-Z-_]+/)? https://example.com/places/text- [R=301,L]

但它输出的正是这个: https://example.com/places/europe/text-text-text-text-text-text-text-text-text-text-text-text-text-text-text-text-text-text-text-text-hungary/budapest/

而不是这个:https://example.com/places/europe/text-hungary/budapest/

是的,额外的 'text-' 重复了 20 次而不是 1 次。

如果我不把 'text-' 放在替换字符串中,一切都会按预期工作,即: https://example.com/places/ [R=301,L]https://example.com/places/europe/hungary/budapest/

什么可能导致这种奇怪的(对我而言)异常? 这应该可以正常工作吗?或者这种情况下的正确语法是什么?

.htaccess 文件中的所有其他代码(位于有问题的 RewriteRule 部分之后):

# BEGIN rlrssslReallySimpleSSL rsssl_version[3.3.5]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/ [R=301,L]
</IfModule>
# END rlrssslReallySimpleSSL

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

是的,这是一个 wordpress 安装。

非常感谢您的帮助!

正如 Amit 在评论中所建议的那样,您 运行 陷入了这个问题,因为模式 [a-zA-Z_-]+/ 匹配原始字符串 hungary 以及目标字符串 text-hungary,因此导致重定向循环。

您可以将此规则与 negative lookahead 一起使用,以防止您在当前规则中遇到的重定向循环:

RewriteRule ^places/([a-zA-Z_-]+/)((?!text-)[a-zA-Z_-]+/)([a-zA-Z_-]+/?)$ /places/text- [R=301,L]

(?!text-) 是一个否定的先行条件,当 </code> 以 <code>text-.

开头时匹配失败

另请注意,未转义的 - 应放在字符 class [...].

的开头或结尾

确保在测试此更改之前清除浏览器缓存。