我想阻止 Apache 从 URI 解码%2B
( +
) 和%3D
( =
)。我需要 PATH_INFO 中未解码的那些字符。
我已经通过使用以下方法对%2F
( ) 进行了此操作:/
AllowEncodedSlashes NoDecode
但是,我找不到任何可以帮助我对其他编码字符执行相同操作的指令。这可能吗?
答案1
您无法阻止 Apache 解码PATH_INFO
Apache 服务器变量中的那些 % 编码字符(PHP 稍后将其分配给$_SERVER['PATH_INFO']
超全局变量,看似未发生改变)。
该指令是一种特殊情况。这实际上是一种“安全功能”。默认情况下, URL 路径部分中的AllowEncodedSlashes
编码斜杠 ( ) 会触发%2F
系统生成404 响应。该AllowEncodedSlashes
指令允许请求到达应用程序(该NoDecode
选项是后来才添加的)。
PATH_INFO
如果您想读取PHP 中的%-encoded,那么可以考虑使用不同的$_SERVER
变量,例如$_SERVER['REQUEST_URI']
,它不是 %-decoded,但这需要一些额外的解析。(请注意,PHP 超全局变量$_SERVER['REQUEST_URI']
与同名的 Apache 服务器变量不同,后者是 %-decoded,如果 URL 被重写,则可能完全引用不同的 URL!)
但是,如果您想PATH_INFO
使用 Apache(使用 mod_rewrite)读取 % 编码,那么请考虑解析THE_REQUEST
服务器变量,该变量包含从客户端发送的整个请求标头。此变量未经过 % 解码。可以将其分配给环境变量甚至 URL 参数,然后由 PHP 以这种方式读取。(请注意,QUERY_STRING
服务器变量和相应的$_SERVER['QUERY_STRING']
超全局变量未经过 % 解码,但 PHP 会解码数组中的各个参数值$_GET
。)