【发布时间】:2014-04-02 03:31:00
【问题描述】:
为什么会这样:
RewriteRule (.+)/$ $1
这项工作:
RewriteRule (.+)/$ $1 [L] #bla bla bla
但这不起作用:
RewriteRule (.+)/$ $1 #bla bla bla
【问题讨论】:
为什么会这样:
RewriteRule (.+)/$ $1
这项工作:
RewriteRule (.+)/$ $1 [L] #bla bla bla
但这不起作用:
RewriteRule (.+)/$ $1 #bla bla bla
【问题讨论】:
最后一条规则不起作用,因为 cmets 并不是真正的 cmets。 htaccess 中的注释必须以# 开头(必须在行首),而不是任意位置。
在第二种情况下,#bla bla bla 被解释为RewriteRule 指令的第四个参数,它被简单地忽略了。
在最后一种情况下,#bla bla bla 被解释为第三个参数,在RewriteRule 的情况下是标志所在的位置,#bla bla bla 不是 mod_rewrite 理解的任何标志,所以你得到一个错误。
【讨论】:
# 必须位于行的“开始”,但它前面可以有任意数量的空格。 (多余的).htaccess 中的空格被忽略,并且可以“洒”在任何地方,包括行首。换句话说,# 必须是一行中的第一个非空白字符。我曾经错误地认为# 必须是字符 1,在最左边的列中!
Apache 的配置文件格式(其中.htaccess 文件是一个示例)在技术上不支持内联cmets,仅支持全行cmets(即以# 开头的一行)。
以哈希字符“#”开头的行被视为 cmets,并被忽略。配置指令后的一行不能包含注释。 -- Official Apache 2.4 manual
然而,令人困惑的是,每个模块都可以根据自己的喜好解析其指令的输入 - 所以mod_rewrite 决定如何处理以RewriteRule 开头的任何行
我不确定,但我猜mod_rewrite 会忽略[flags] 之后的所有内容,而# 实际上根本不需要。
不过,最好的办法是始终让 cmets 保持自己的路线,因为无论您评论的指令如何,这都会起作用。
【讨论】: