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