Apache 指令容器中正则表达式的正确语法

问题描述 投票:0回答:1
  1. 将 RegEx 与 容器路径一起使用的正确语法是什么?我只是对 ~ 和 ^ 的用法感到困惑。何时以及如何使用它们?
<Directory ~ /home/user/(site|sitedev)>
    ...
</Directory>
<DirectoryMatch ^/home/user/(site|sitedev)>
    ...
</DirectoryMatch>
  1. 引号是始终需要的还是仅当值中有空格或特殊字符时才需要?
"/home/user/(site|sitedev)"
/home/user/(site|sitedev)
  1. 此外,匹配以下所有文件夹的正则表达式是什么:
/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.*
regex apache .htaccess httpd.conf
1个回答
0
投票

我不是专家,但我想说:

  1. <Directory ~ "^/home/user/(site|sitedev)">

    相当于
    <DirectoryMatch "^/home/user/(site|sitedev)">

    两者都是核心内置的。我更喜欢第二个,因为它太多了 对于初学者来说更容易阅读。

  2. 你是对的,如果有空格,需要引号。
    我个人总是引用它们,以保持配置文件的一致性。

  3. ^/home/my/site.*
    正确的是:

    • ^
      的意思是“开始于”。这就是为什么它不能放在前面 就像您在
      /home/my/^site.*
      中提到的“网站”。如果你不这样做 将这个
      ^
      放在开头,然后是一个 URL,例如
      /test/home/user/sitedev
      也会匹配。这是因为一个 模式的使用类似于搜索,如果在路径中找到它,则 它匹配,您将进入
      <DirectoryMatch>
      块。

^
相反,您可以使用
$
,意思是“完成”。
这对于将所有 JPEG 文件与
\.jpe?g$
匹配非常有用,其中 点应该被转义,因为
.
表示“任何字符”并且
?
表示前面的“e”字符是可选的。当然,这个例子不会用在
<DirectoryMatch>
上,而是用在
<FilesMatch>

注意,正则表达式可以区分大小写,也可以不区分大小写,因此无法匹配

/img/IMG234.JPG
取决于配置。我认为这取决于 正则表达式默认选项
ICASE
是否“开启”。

但我通常更喜欢通过启用来解决这个配置问题 模式开头的“不区分大小写”标志

(?i)\.jpe?g$
或通过包装特定部分来启用它 在
(?i:
)
之间,如下所示:
(?i:\.jpe?g)$

示例:

© www.soinside.com 2019 - 2024. All rights reserved.