阻止 Apache 從 URI 中解碼 PATH_INFO 的字元
我想阻止 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
。)