问题描述
我对 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
ORtemp
,其前后是_
- 现在是捕获组:在 .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