提问人:Kejatz 提问时间:9/14/2023 更新时间:9/14/2023 访问量:34
Apache 指令容器中正则表达式的正确语法
Proper Syntax for RegEx in Apache Directive Containers
问:
- 将 RegEx 与 <Directory> 和 <DirectoryMatch> 容器路径一起使用的正确语法是什么?我只是对 ~ 和 ^ 的用法感到困惑。何时以及如何使用它们?
<Directory ~ /home/user/(site|sitedev)>
...
</Directory>
<DirectoryMatch ^/home/user/(site|sitedev)>
...
</DirectoryMatch>
- 引号是始终需要引号,还是仅当值中有空格或特殊字符时才需要引号?
"/home/user/(site|sitedev)"
/home/user/(site|sitedev)
- 此外,匹配以下所有文件夹的正则表达式是什么:
/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.*
答:
0赞
Patrick Janser
9/14/2023
#1
我不是专家,但我会说:
<Directory ~ "^/home/user/(site|sitedev)">
相当于
两者都是核心内置的。我更喜欢第二个,因为它很多 对于初学者来说,阅读起来更清晰。<DirectoryMatch "^/home/user/(site|sitedev)">
你是对的,空格需要引号。
我个人总是引用它们,以确保配置文件的一致性。^/home/my/site.*
是正确的:^
意思是“开始”。这就是为什么它不能放在前面的原因 “网站”,就像你在 .如果你不这样做 把它放在开头,然后一个 URL 也会匹配。这是因为 pattern 的使用方式类似于搜索,如果在路径中找到它,则 它匹配,您将进入该块。/home/my/^site.*
^
/test/home/user/sitedev
<DirectoryMatch>
在 的反义词中,您可以使用 ,表示“完成”。
这对于将所有 JPEG 文件与 匹配非常有用,其中
点应该转义,因为表示“任何字符”,并表示前面的“e”字符是可选的。当然,这个例子不会用在 a 上,而是用在 .^
$
\.jpe?g$
.
?
<DirectoryMatch>
<FilesMatch>
注意,正则表达式可以区分大小写,也可以不区分大小写,因此根据配置的不同,它无法匹配。我认为这取决于RegexDefaultOptions。
是否为“on”。/img/IMG234.JPG
ICASE
但我通常更喜欢通过启用来解决这个配置问题
模式开头的“不区分大小写”标志,或通过包装特定部分来启用它
之间和像这样:.(?i)\.jpe?g$
(?i:
)
(?i:\.jpe?g)$
例子:
- 开头不区分大小写的标志:
(?i)\.jpe?g$
- 模式的一部分不区分大小写:
(?i:\.jpe?g)$
- 模式的一部分不区分大小写,带有替换的更完整示例:
/img/([^/]+)(?i:\.jpe?g)$
()
用于捕获路径的一部分。这是文件 basename。它将在变量(1 = 第一组)中可用。 如果您有另一个捕获组,那么您将有第二个捕获组 变量,称为 。请参阅此示例,其中包含 2 个捕获组。$1
$2
[^ ]
表示“列表中不是字符”。所以意味着“任何字符 这不是斜杠”。表示 0 或 N 次。但意味着 1 或 N 次。因此,将匹配文件的基本名称。[^/]
*
+
[^/]+
评论
0赞
Kejatz
9/16/2023
非常感谢!我还有几个两难境地。如何匹配服务器根目录: 或者 为了 Apache 性能,建议在任何地方禁用 .htaccess 文件,除非需要,这些文件是我的 WordPress 站点和 public_html 文件夹中的站点。可以这样完成吗:<Directory>
<Directory /> <Directory "/">
<Directory /> AllowOverride None </Directory> <Directory ~ ^/home/user/(sites|public_html)> AllowOverride All </Directory>
0赞
Patrick Janser
9/19/2023
@Kejatz 是的,扫描 .htaccess 文件需要一些时间。您似乎可以访问服务器配置,因此您可以将 .htaccess 文件的内容移动到每个专用虚拟主机的配置中。如果您禁用覆盖,请不要忘记搜索所有可能位于WordPress网站子文件夹中的.htaccess文件。每次更新或模块安装后,都必须检查更改,以便将其报告给主虚拟主机配置。但是,检查/设置 HTTP 标头以允许内容缓存将对性能产生更高的影响。
评论