禁止网址的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或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.phpOR%{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,NC,L]
上面例子的解释:我们可以看到我们在规则端匹配firstORsecond,所以现在 $1 的值将是第三个或第四个,因为我们第一次/第二次使用了非捕获组。所以后端条件检查将变成:%{DOCUMENT_ROOT}/third.php或%{DOCUMENT_ROOT/fourth.php