如果我尝试将它与 $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 [...]
.
的开头或结尾
确保在测试此更改之前清除浏览器缓存。
我尝试在 .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 [...]
.
确保在测试此更改之前清除浏览器缓存。