禁止网址的 htaccess 重写规则

问题描述

我对 htaccess 重写并不陌生,但今天我看到了一个我以前从未见过的规则:

# Access block for folders
RewriteRule _(?:recycler|temp)_/ - [F]

此规则是 Typo3 htaccess 文件的一部分。

“?:”是什么意思?这是某种反向引用吗?下划线代表什么? 非常感谢!

解决方法

规则 RewriteRule _(?:recycler|temp)_/ - [F] 可以分为 2 条规则以便更好地理解。喜欢:

RewriteRule _recycler_/ - [F]

RewriteRule _temp_/ - [F]

现在让我们了解这意味着什么:

  • 您可以看到它是从 2 个规则中创建 1 个规则的快捷方法。
  • 我们可以使用正则表达式来匹配多个模式,并对落入相同条件(由正则表达式匹配)的 URI 执行相同类型的操作。
  • 在本例中,我们尝试匹配 _(文字字符)后跟 (?:recycler|temp)。其中 ?: 代表非捕获组。因此,此部分中的任何内容(?:.......) 都不会具有反向引用功能。它在正则表达式中基本匹配字符串/文本 recycler OR temp ,其前后是 _
  • 现在是捕获组:在 .htaccess 中,我们可以使用捕获匹配值的功能,我们可以稍后使用它们,例如--> $1 用于获取第一个捕获值(存储在内存中),我们可以说非捕获组告诉我们想要匹配一个正则表达式,但不要将它存储到内存中(因为我们不想稍后在我们的程序中使用它)。

以下是在 htaccess 规则中捕获组规则的示例:

RewriteEngine ON
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f [NC]
RewriteRule ^(first|second)/(.*)?$ $1.php?$2 [QSA,NC,L]

上面例子的解释: 它只是简单地制作了 2 个捕获组,第一个将有第一个或第二个捕获组,第二个捕获组将有任何东西(因为我们使用了 .* ),所以在重写部分时,我们使用 $1$2 来获取值。您可以清楚地看到,我们也可以在条件部分使用这些值(在后端变为:%{DOCUMENT_ROOT}/first.php OR %{DOCUMENT_ROOT}/second.php)。

以下是 htaccess 规则中非捕获组的示例:

RewriteEngine ON
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f [NC]
RewriteRule ^(?:first|second)/(third/fourth)/?$ $1.php [QSA,L]

上面例子的解释: 我们可以看到我们在规则端匹配 first OR second 所以现在 $1 的值将是这次是第三个或第四个,因为我们第一次/第二次使用了非捕获组。所以后端条件检查将变成:%{DOCUMENT_ROOT}/third.php OR %{DOCUMENT_ROOT/fourth.php