由於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去解析,所以程序出現了問題。
感謝鳥哥快速的答復!