代码之家  ›  专栏  ›  技术社区  ›  ESP32

htaccess重写规则,带问号+冒号(?:)

  •  0
  • ESP32  · 技术社区  · 4 年前

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

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

    这条规则是规则的一部分 Typo3 htaccess 文件

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

    0 回复  |  直到 4 年前
        1
  •  6
  •   RavinderSingh13 Nikita Bakshi    4 年前

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

    RewriteRule _recycler_/ - [F]
    

    RewriteRule _temp_/ - [F]
    

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

    • 您可以看到,这是一种快捷方法,可以在两条规则中选择一条。
    • 我们可以使用正则表达式匹配多个模式,并对符合相同条件(由正则表达式匹配)的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]
    

    对上述示例的解释: 它只是由两个捕获组组成,第一个捕获组包含第一个或第二个捕获组,第二个捕获组包含任何内容(因为我们使用了。*),所以在重写我们正在使用的部分时 $1 $2 要实现这些价值观。您可以清楚地看到,我们也可以在条件部分中使用这些值(在后端变成: %{DOCUMENT_ROOT}/first.php %{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]
    

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