我想阻止 Apache从 URI解码%2B
( +
) 和%3D
( )。=
我需要那些未在 PATH_INFO 中解码的字符。
我已经通过使用%2F
( /
) 做到了这一点:
AllowEncodedSlashes NoDecode
但是,我找不到任何可以帮助我对其他编码字符执行相同操作的指令。这甚至可能吗?
我想阻止 Apache从 URI解码%2B
( +
) 和%3D
( )。=
我需要那些未在 PATH_INFO 中解码的字符。
我已经通过使用%2F
( /
) 做到了这一点:
AllowEncodedSlashes NoDecode
但是,我找不到任何可以帮助我对其他编码字符执行相同操作的指令。这甚至可能吗?
您无法阻止 Apache 解码
PATH_INFO
Apache 服务器变量中的那些 % 编码字符(PHP 稍后将其分配给$_SERVER['PATH_INFO']
超全局,看似未更改)。该
AllowEncodedSlashes
指令是一种特殊情况。这确实是一个“安全功能”。默认情况下,%2F
URL 路径部分中的编码斜杠 ( ) 会触发系统生成的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
。)