在 .htaccess 中转义字符

在 .htaccess 中转义字符

我找不到正确的列表(或者您需要注册某种论坛或不清楚列表)来说明.htaccess文件中哪些字符应该转义。我发现点不需要转义 - 但对我来说这是不合理的,因为它们在“正则表达式”中有意义。

例如这个重写...

RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} /index.php\/component\/users\/\?task=registration.register [NC]
RewriteRule .* - [F,L]

它已经转义了所有不是“开始”的斜线,但 POST 仍然是“通过”

我的问题是 - 有人有应该转义的字符的列表吗?

答案1

有人有应该转义哪些字符的列表吗?

你不会找到一个简单的列表。

特定字符是否需要转义.htaccess(或 Apache 配置文件中一般的转义)取决于语境(模块/指令和参数)以及您想要做什么(使用元字符的特殊含义或匹配文字字符)。

唯一一个普遍需要转义的字符.htaccess空间. 自空间用作之间的分隔符参数。如果参数本身包含空格,则必须对其进行转义,否则该指令将无法正确编译。如果参数包含空间那么你可以使用反斜杠转义它,或者用双引号将整个参数括起来。(如果参数是正则表达式,那么使用空格改为简写字符类\s

我发现点不需要转义 - 但对我来说这是不合理的,因为它们在“正则表达式”中有意义

嗯,确实如此,您不能一概而论地说点不需要转义 - 这毫无意义。点是否需要转义取决于上下文和含义。例如:

  • 在普通的字符串参数中(例如RewriteCond 测试字符串或者RewriteRule 代换) 您无需转义点。这里的点没有特殊含义。在这里转义点不会造成任何损害 - 它什么也不做 - 但可能会影响可读性,这是一个重要的考虑因素。

  • 在正则表达式中(例如RewriteCond 条件模式或者RewriteRule 图案以及任何其他采用正则表达式的 Apache 指令/参数):

    • 如果您希望匹配任何字符(换行符除外),那么您不应该转义点。
    • 如果您希望匹配文字点,则需要转义该点以否定其特殊含义。
    • 然而,为了匹配文字点在字符类中那么就不需要转义点。因为在正则表达式字符类中使用时,点不具有任何特殊含义。

请注意,Apache 使用 PCRE(Perl 兼容正则表达式)风格的正则表达式。适用相同的转义。

它已经逃脱了所有不是“开始”的斜线......

这确实没有意义。(不幸的是,有很多 mod_rewrite/regex 示例并不完全正确。)

斜线 ( /) 不需要转义,因为它在正则表达式中没有特殊含义(没有斜线分隔符)。逃避它并没有什么坏处(除了可读性),但省略第一个斜杠并转义其余部分看起来像是错误/打字错误。没有理由只转义一个而不转义另一个。


在旁边:

RewriteCond %{REQUEST_URI} /index.php\/component\/users\/\?task=registration.register [NC]

然而,整个情况看起来错误。不是因为反斜杠转义,而是因为看起来您似乎试图将查询字符串与REQUEST_URI服务器变量进行匹配。REQUEST_URI服务器变量仅包含 URL 路径。只有当问号 ( ?) 像请求中一样经过 URL 编码时%3F(即没有查询字符串),这才会匹配 - 这将是不寻常的。通常,这种情况永远不会匹配,并且请求永远不会被阻止。

为什么两个点都没有被转义?看起来它们应该在这个语境。但只有您才知道是否应该这样做。

RewriteRule .* - [F,L]

L标志不是必需的(它是默示与标志一起使用时F)。.*正则表达式不是最佳的,但是,RewriteCond应该删除该指令,并在RewriteRule 图案反而。

答案2

.htaccess支持的不仅仅是mod_rewrite 指令。

这列出了 Apache 支持的所有指令以及它们是否允许在.htaccess文件中使用https://httpd.apache.org/docs/2.4/mod/quickreference.html

并非 .htaccess 中允许的每个指令都具有相同的转义“特殊”字符的规则/要求,因为许多指令不是正则表达式。通常,手册会列出哪些规则集控制着指令

可能感兴趣的是 https://httpd.apache.org/docs/2.4/expr.html
https://httpd.apache.org/docs/2.4/rewrite/intro.html#regex

相关内容