gpt4 book ai didi

regex - 在配置文件和 .htaccess 中的 Apache 指令中使用 RegEx

转载 作者:行者123 更新时间:2023-12-05 04:29:33 26 4
gpt4 key购买 nike

如果我理解正确,下一段代码中的表达式 .ht* 将匹配所有以 .ht 开头的,所以我的 .ht_lalala 是安全的。

<Files ".ht*">
Require all denied
</Files>

但是下一个呢?

(^\.ht|~$|back|BACK|backup|BACKUP$)

匹配文件是否正确:.htaccessbackbackupBACKUP?或者下一个会更好

(^\.ht*|back*|BACK*$)

我想了解的是 ~$ 在我的代码中的实际含义(在 RegEx 模式中)。我不知道为什么以及什么时候把它放在那里,但我的代码中有它,现在我怀疑它是否正确。


我知道有关 RegEx 的基本知识,什么是 ^$* 表示来自先前文本/标记的 0 或 N,但是 ~ 在模式内部没有意义,除非它只是一个简单的字符并且它除了字面匹配 ~ 什么都不做。我读过 Apache 文档,我想对于多个匹配 FilesMatch 和 DirectoryMatch 更好,但是正则表达式也可以用于指令:文件和目录,加上 ~ 字符,如文档示例中所述。

<Files ~ "\.(gif|jpe?g|png)$">
#...
</Files>

好吧,我真正想要的是知道如何匹配不同的文件或目录。

还有一件事,我应该转义 . 吗?因为默认的 httpd.conf 不这样做。或者它只是对于 httpd.conf 和 .htaccess 不同(这对我来说没有意义)


更新

回答我自己的问题,我如何与 RegEx 匹配 .ht、.htaccess、.htpasswd、back、BACK、backup、BACKUP,首先我决定使用 . (点)在我想隐藏的任何东西的名称中。其次,我发现简洁的模式 ^(\..*)$ 会完成这项工作,会给我我需要的东西。或者 ^\. even better!所以,如果将来我想隐藏一些东西,我只需在名称的开头添加 .

我们开始吧,下一段代码将拒绝从网络访问名称以开头的任何文件和目录。(已测试,有效)

RegEx 模式匹配:

<FilesMatch "^\.">
Require all denied
</FilesMatch>

<DirectoryMatch "^\.">
Require all denied
</DirectoryMatch>

并且在精彩的解释中@MrWhite clarified and simplified我的方法,所以我坚持这个(测试,有效)

通配符字符串匹配:

<Files ".*">
Require all denied
</Files>

<Directory ".*">
Require all denied
</Directory>

最佳答案

<Files ".ht*">

在这种情况下,.ht* 不是正则表达式 (regex)。它是一个“通配符字符串”,其中 ?匹配任何单个字符,*匹配任何字符序列。 (虽然这也是一个有效的正则表达式 - 正则表达式会以不同的方式匹配)。

But what about next one?

(^\.ht|~$|back|BACK|backup|BACKUP$)

这是一个正则表达式(它不能在你上面写的 <Files> 指令中使用,没有启用与 ~ 参数匹配的正则表达式模式 - 正如你稍后使用的那样。)

在这个正则表达式中,~$匹配任何以文字 ~ 结尾的字符串(波浪字符)。这有时用于标记备份 文件。

它也匹配...

  • 任何以.ht 开头的字符串(自然包括 .htaccess )。
  • 任何包含 back 的字符串或 BACKbackup (匹配 backup 显然是多余的)。
  • 任何以 BACKUP 结尾的字符串.

因此,这看起来并不像您认为的那样。

Or next will be better instead

(^\.ht*|back*|BACK*$)

虽然这是一个有效的正则表达式,但您显然又回到了“通配符”模式匹配的组合。请记住,在正则表达式中,*量词与 previous 标记匹配 0 次或更多次。它不匹配“任何字符”,如通配符模式匹配。

这仍然匹配“.htaccess”,但只是因为模式没有锚定。例如,^\.ht*$ (带有字符串结尾 anchor )匹配“.htaccess”。

<Files ~ "\.(gif|jpe?g|png)$">

随着 Files指令,~参数启用正则表达式模式匹配。 (正如你所说。)这与 ~ 时完全不同。在正则表达式模式本身内部使用。

One more thing, should I escape the .? Because default httpd.conf doesn't do so. Or it's just different for httpd.conf and .htaccess (which doesn't make sense to me)

我认为你把事情搞混了。在您的第一个示例中,它不是正则表达式,而是“通配符”模式(如上所述)。在这种情况下,.不能反斜杠转义。它匹配文字 . (点)。 .在这里没有特殊意义。 .仅当您需要匹配正则表达式中的文字点时才应进行转义。

例如,以下是等价的:

# Wild-card string match
<Files ".ht*">

# Regex pattern match
<Files ~ "^\.ht">

(但是,最好使用 FilesMatch 而不是 Files ~ 以避免混淆。FilesMatch 是“较新”的语法。)

httpd.conf之间没有区别和 .htaccess在这方面。


更新:

I found out that laconic pattern ^(\..*)$ will do the job ...

Here we go, next code will deny access from the web to any files anddirectories which names start with . (tested, works)

<FilesMatch "^(\..*)$">
Require all denied
</FilesMatch>

这可以简化。您不需要完全匹配整个文件名。您只需要断言文件名以点开头(这样效率更高)。因此,您不需要捕获(带括号的子模式)文件名 - 您没有对它做任何事情。

要使用正则表达式断言文件名以点开头,则只需使用 ^\. - 仅此而已。例如:

<FilesMatch "^\.">

请记住,正则表达式量词(例如 *)默认贪婪,因此您无需遵循 .* 这样的模式匹配文件名时带有字符串结尾 anchor 。所以,正则表达式 ^.*$.*在这种情况下实际上是相同的。两者都匹配整个文件名。 (在此上下文中没有换行符。)

这可以进一步“简化”,方法是完全不使用正则表达式并使用带有 Vanilla <Files> 的通配符字符串模式指示。例如,这与:

<Files ".*">

注意:这不是正则表达式。它是一个文字点,后跟任意数量的字符(通配符语法)。

关于regex - 在配置文件和 .htaccess 中的 Apache 指令中使用 RegEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72291072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com