问题描述
我发现相关但不完全相同。如果有人可以解释为什么使用此加号(+
)。
我发现了^(.*)
这个东西,但没有找到^(.+)
我需要更多说明为什么要使用此加号。那是什么意思
RewriteRule ^(.+)/$ $1
解决方法
这个问题有两个方面:
-
正则表达式(regex)
^(.*)
与^(.+)
的解释 -
在
RewriteRule
的{{1}}指令中使用正则表达式。
tl; dr 是的,两个正则表达式的含义不同。但是,在.htaccess
的{{1}}指令中使用一个或另一个并没有真正的区别。
正则表达式
RewriteRule
.htaccess
和^(.+)/$
是量,分别表示前一组的“ 0或更多”和“ 1或更多”。
*
(点)是一种特殊的元字符,可以匹配任何字符(换行符除外)。
因此,+
匹配0个或多个“任何字符”,而.
匹配1个或多个“任何字符”。 (然后必须在其后加上斜杠。)
.*
和.+
是 anchors ,分别声明字符串的“开始”和“结束”,因此^
匹配URL路径以斜杠结尾,捕获URl路径 末尾斜杠的一部分。 $
前缀是严格可选的,因为正则表达式默认情况下是贪婪的。
^(.+)/$
在^
RewriteRule ^(。+)/ $ $ 1
在RewriteRule
中使用时,在这里使用.htaccess
还是.htaccess
都没有关系,因为*
(斜杠)将永远不会出现在URL的开头, +
模式匹配的路径。 (在应用/
模式之前,URL路径开头的多个斜杠均已被解析。)
但是,如果此指令是在 server 或 virtualhost 上下文中使用的(即,在服务器配置中不是RewriteRule
或RewriteRule
容器中),则您需要 使用.htaccess
,以防止在URL路径的开头(当请求 root 目录时)斜杠被匹配。
但是...该指令本身并不完全正确-缺少某些部分。这可能应该是外部重定向(但缺少<Directory>
标志),因此,将需要一个+
指令(除非将 substitution 字符串修改为包括斜杠前缀)。