我找不到正确的列表(或者您需要注册某种论坛或不清楚列表)来说明.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