Apache指令容器中RegEx的正确配置

6g8kf2rb  于 2023-10-22  发布在  Apache
关注(0)|答案(1)|浏览(101)

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.*
7fyelxc5

7fyelxc51#

我不是Maven,但我会说:

  1. <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。

相关问题