1.在和容器路径中使用RegEx的正确语法是什么?我只是对~和^的用法感到困惑。何时以及如何使用它们?
<Directory ~ /home/user/(site|sitedev)>
...
</Directory>
<DirectoryMatch ^/home/user/(site|sitedev)>
...
</DirectoryMatch>
1.引号总是必需的还是只有当值中有空格或特殊字符时才需要?
"/home/user/(site|sitedev)"
/home/user/(site|sitedev)
1.此外,什么是RegEx以匹配以下所有文件夹:
/home/my/site
/home/my/siteblog
/home/my/sitestore
or any other that starts with /home/my/site doesn't go deeper like /home/my/siteblog/random
这两种方法可以解决问题吗?有什么区别?
^/home/my/site.*
/home/my/^site.*
1条答案
按热度按时间7fyelxc51#
我不是Maven,但我会说:
<Directory ~ "^/home/user/(site|sitedev)">
相当于
<DirectoryMatch "^/home/user/(site|sitedev)">
两者都是内置的核心。我更喜欢第二个,因为它对初学者来说读起来更清晰。
1.你是对的,在空格的情况下需要引号。
我个人总是引用它们,以保持配置文件的一致性。
^/home/my/site.*
是正确的:^
的意思是“开始”。这就是为什么它不能像你在/home/my/^site.*
中提到的那样放在“sites”之前。如果你不把这个^
放在开头,那么像/test/home/user/sitedev
这样的URL也会匹配。这是因为模式的使用类似于搜索,如果在路径中找到它,那么它就会匹配,并且您将输入<DirectoryMatch>
块。与
^
相反,您可以使用$
,意思是“完成”。这对于匹配所有带有
\.jpe?g$
的JPEG文件非常有用,其中的点应该被转义,因为.
表示“任何字符”,而?
表示前面的“e”字符是可选的。当然,这个例子不会用在<DirectoryMatch>
上,而是用在<FilesMatch>
上。注意,正则表达式可以区分大小写,也可以不区分大小写,所以它不能匹配
/img/IMG234.JPG
,这取决于配置。我认为这取决于RegexDefaultOptions。如果ICASE
是“开”或不。但我通常更喜欢通过在模式的开头使用
(?i)\.jpe?g$
启用“大小写不敏感”标志来解决这个配置问题,或者通过将其 Package 在(?i:
和)
之间来为特定部分启用它,如下所示:(?i:\.jpe?g)$
。示例如下:
(?i)\.jpe?g$
(?i:\.jpe?g)$
/img/([^/]+)(?i:\.jpe?g)$
()
用于捕获部分路径。这是档案袋。它将在变量$1
中可用(1 =第一组)。如果你有另一个捕获组,那么你将有第二个变量,名为$2
。看看这个example with 2 capturing groups。[^ ]
表示“列表中没有字符”。所以[^/]
的意思是“任何不是斜杠的字符”。*
表示0或N次。但是+
意味着1或N次。所以[^/]+
将匹配文件的baseD。