由於map路由下用戶請求的url會按照"/"分級對應到controllers下的目錄下的Controller上,action則默認為indexAction,所以想要實現/key1/param1/key2/param2這種形式進行傳參,就要通過delimiter來講url分割成req_uri和query_str兩個部分。
在實踐中,定義了delimiter(盡管並沒有用到它的功能),這時,如果用戶的請求(更多的是爬蟲或掃站)無意中包含以下形式:/aaa/bbb[delimiter](xxx)?/key1/param1/key2/param2...,會造成程序崩潰。
將這個問題提給鳥哥後,鳥哥迅速給出了修復(18~19行):
1 if (Z_TYPE_P(delimer) == IS_STRING 2 && Z_STRLEN_P(delimer)) { 3 if ((query_str = strstr(req_uri, Z_STRVAL_P(delimer))) != NULL 4 && *(query_str - 1) == '/') { 5 tmp = req_uri; 6 rest = query_str + Z_STRLEN_P(delimer); 7 if (*rest == '\0') { 8 req_uri = estrndup(req_uri, query_str - req_uri); 9 query_str = NULL; 10 efree(tmp); 11 } else if (*rest == '/') { 12 req_uri = estrndup(req_uri, query_str - req_uri); 13 query_str = estrdup(rest); 14 efree(tmp); 15 } else { 16 query_str = NULL; 17 } 18 } else { 19 query_str = NULL; 20 }
通過delimer獲取了query_str後,判斷delimer的前一個字符是"/"的情況,卻沒有判斷不是的情況,導致不符合/aaa/bbb/[delimer]/key1/param1/...形式的urk被截斷成req_uri和query_str去解析,所以程序出現了問題。
感謝鳥哥快速的答復!