湘軍將士因為攻金積堡一年來,傷亡慘重,老統領劉鬆山也陣亡,都紛紛稟告左宗棠,要求立即殺死馬化鴇雪忿。左宗棠知道清廷也不會寬恕他,但是考慮到甘局仍應以“撫”為重,河州馬占鼇早有就撫的意思,西寧馬尕三也可能就撫,如果現在殺馬化鴇,對撫局將不利,因此將馬化鴇暫留在軍中,報奏朝廷,認為暫時不宜殺他,待收複最後一個據點王家疃後,再根據罪惡輕重“重者誅夷,輕者遷徙。”清廷同意了他的請求,但是指出,以後即使馬化鴇在招撫方麵立了功,也不準左宗棠代為乞恩減罪,說:“屆時不得以收複各處代為乞恩,以伸國法,而快人心。”
一個月後,馬化鴇派親信去招撫了王家疃的回軍。第二年(同治十年)正月,劉錦棠派兵丁入堡搜查,又找出藏匿洋槍1000多支,認為不是真心投降;左宗棠原給他留了一條立功的後路,但清廷已諭示不準代為乞恩減罪,於是將馬化鴇父子和親隨等人處死。
金積堡攻堅戰雖然成功,但是曆時久,清軍傷亡重大,還損折了劉鬆山、簡敬臨、李就山等9員大將。左宗棠說,他經曆了10餘年的太平軍和撚軍戰爭,從沒有像這次傷亡慘重。然而金積堡的攻陷,對甘肅回軍的震動更大,形勢也急轉直下。
清軍的第二個目標,是馬占鼇據守的河州。馬占鼇本來就有歸順之意,他隻是在觀望戰局。馬化鴇既已失敗,他就撫的決心也增大,但仍要看看形勢。河州與西寧一帶原是古代河湟之地。河州在洮河之西,由安定、隴西進軍必須渡過洮河。左宗棠下令準備船舶、橋梁和其它渡河工具。同治十年六月,分三路進軍;八月,大軍渡過洮河,馬占鼇還一路抵擋,清軍乘勝直逼河州外圍要隘太子寺和董家山,馬占鼇仍然頑強抵抗,清軍兩員大將傅先宗和徐文秀在攻堡壘時陣亡,左宗棠派王德榜和沈玉遂接統他們的軍隊,繼續猛攻。馬占鼇看到官軍深入,形勢已無望,又聽說西寧的客、土回都已歸順,後退之路已絕,於是派人到清軍營中,表示願交出馬械,誠意就撫。還派遣子弟到安定大營獻良馬,願受約束。左宗棠接受了要求,命子弟和隨從使者都回去,回軍部隊留駐原地。他了解到馬占鼇就撫確有誠意,保奏清廷任命他為統領,率領原回軍部隊,改編為三旗。
河州平複,左宗棠於是由安定進駐任所省會蘭州,距被任命為總督之時,已有6年了。 正當西征軍在河州作戰時,新疆形勢發生了變化。前一年(同治九年)阿古柏趕走妥明,占領了烏魯木齊和北疆,新疆全境淪陷。這年五月,俄羅斯借口阿古柏兵侵擾邊境,乘機而入,奪取了伊犁地區,聲言還要代清政府收取烏魯木齊。清朝廷著急了,趕緊詔命榮全署伊犁將軍,去收複伊犁;命滯留在肅州高台幾年不敢上任的烏魯木齊提督成祿,趕速率部隊出關,與都統景廉會合收複烏城。又命劉銘傳率淮軍自陝西經肅州西進,並命左宗棠進駐肅州。 左宗棠分析了當時的軍事形勢,認為用兵次第應是先關內、後關外。須先收複河州和西寧,然後打通肅州要道,大軍出關,才無後顧之憂。當然,在“強鄰覬覦狡然思逞之時”,也可先派軍出關,不必拘執,但關外還不到最緊急的時候,目前還應集中兵力,肅清關內。他得到詔令後,先派徐占彪率領蜀軍開赴肅州,大軍在收複河州之後,於是迅速向回軍第三個堡壘——西寧進攻。
西寧回軍領袖原是馬尕三(文義),尕三死後,由馬永福接替。西寧辦事大臣玉通主“撫”,馬永福也表示願就“撫”,玉通就派馬永福的侄兒桂源為西寧知府,本源為鎮標遊擊,代行總兵。一個掌政權,一個掌兵權。他們的就“撫”並不是真心誠意,一直在觀望戰局。當馬化鴇失敗後,馬桂源看到形勢不利,曾向清軍求撫,馬占鼇就是因聽說西寧已就撫,才跟著求撫的。不想馬桂源後來又改變了主意,他看到新疆的變化,清軍準備出關,西寧、金積堡和肅州回軍以往都和新疆的清真王妥得瞞有聯係,那時白彥虎和禹得彥帶領陝西回軍殘部也逃到了西寧,因此桂源、本源兄弟聯合白彥虎等,繼續抗擊清軍。在清軍進逼之下,他們率領回軍、民全數從西寧城內撤出,在外圍作戰。城內隻剩下漢族和滿族官員、3萬餘漢民和少數未撤出的千餘回民。漢民將城門關閉,推舉西寧道郭襄之主持守城,等候清軍,西寧城實際在回軍包圍之中。
進攻西寧回軍的清軍主力,是劉錦棠新招募的湘軍和譚拔萃的老湘軍,左宗棠又調來陝北的宋慶軍和寧夏的張曜軍,後來又派劉明鐙軍助攻。同治十一年(1872年)十月,在幾路大軍圍攻之下,馬桂源兄弟放火焚燒東關,然後率部隊逃往東川,不久又到巴燕戎格,被圍困兩月的西寧城於是解圍。男女難民3萬餘迎接清軍;還有一千餘回民,劉錦棠叫他們安居原處,城外回民和陝回民崔偉、禹得彥等也紛紛求“撫”,隨馬桂源逃走的回軍民也相繼逃回來。劉錦棠軍乘勝追擊,同治十二年正月,在巴燕戎格消滅了由西寧逃出的回軍主力。馬永福求撫,本源、桂源也被迫求撫。隻有白彥虎率領餘小虎等2000餘人往北逃到肅州。
肅州是西北重鎮,由甘肅入新疆的要衝,也是回軍最後的一個強大據點。它於同治四年被馬文祿占領。馬文祿和清政府關係也是反反複複。他多次打敗清軍;後來又和駐紮在高台的成祿等講和。當左宗棠派徐占彪率蜀軍向肅州進發時,馬文祿又聯絡由西寧逃來的白彥虎餘部,以及由新疆入關增援的維族地方武力據城抵抗。
由於西北三大回軍據點都已被清軍攻占,因此左宗棠這時可能以集中軍力來攻打肅州。除先來的徐占彪軍外,又陸續調來宋慶、張曜和金順各軍,將肅州團團圍住。肅州城高三丈六尺,厚三丈餘,外有城壕圍繞,闊八丈三尺,深二丈,是一座險固的堡壘。清軍圍攻了好幾個月,傷亡慘重,一直沒有得手。
這時新疆的情勢愈急,清廷命成祿速出關,成祿不得已由高台出關屯駐在玉門。這位名為“烏魯木齊都統”的官,卻7年來從未出關一步,不單如此,在關內還胡作非為,苛索老百姓幾十萬兩錢銀,誣良為盜,濫殺無辜老幼婦女和由肅州來高台避難的人民,包括大批回民,真是罪惡累累,朝廷幾次命他出關,他以缺糧為借口,拒不出關。左宗棠以前曾彈劾他,但清廷袒護滿官員,置之不理,這次左宗棠又查實他的罪惡,再上章彈劾,清廷不能再置之不問,下旨拿問。並命金順兼統成祿的部隊出關。左宗棠考慮當時肅州尚未攻下,赴新道路還不暢通,糧運困難。逃到肅州的白彥虎因看到形勢不妙,已逃出關外,抵達敦煌附近。金順如率少數部隊出關,恐怕也敵不過白彥虎。因此奏請清廷,讓金順推遲兩個月出關,那時估計肅州可以克複,新糧又已上市,全軍再次第西進。朝廷同意了他的意見。
同治十二年八月,左宗棠親自到肅州城外巡視督戰,肅州已被圍困一年半了,雖然尚未被攻下,但實力已耗盡,難於支持。馬文祿於是決定求撫。一個月後,劉錦棠率領湘軍從西寧來增援,軍勢越大,馬文祿感到絕望,親自到左宗棠軍中就撫。左宗棠命他繳出馬械,並報上漢民及回民的戶籍。當馬文祿上次受撫時,城中漢民還有3萬餘人,先後為馬文祿所殺,現隻剩男女1100餘人。左宗棠命將原籍關外沙州,以及從甘州、西寧、河州、陝西等地逃來的客回先送到城外廢堡中安置,以後再安排到各地定居。馬文祿和9名從犯因殺人太多,罪惡重大,處以死刑。清軍士兵因為圍攻肅州日久,傷亡很大,又知道城內漢人被殺很多,顧不得左宗棠不準濫殺的多次指示,進城後殘殺回民。
左宗棠一向對軍紀很重視,他認為民族矛盾不是可以靠“軍威”和“屠殺”來解決的。他曾指示劉錦棠:“宜嚴殺老弱婦女之禁”,又命令徐占彪:“嚴飭各營勿得稍有侵暴,致失人和。”命令劉端冕:“申明紀律,除臨陣外不準濫殺,不準奸淫婦女,搜搶財物,燒毀糧食。”這次部隊在肅州濫殺,雖然是部隊沒有照他的意誌辦,但他作為統帥,負有責任,對此他一直深感歉憾。後來他給金順的信說:“弟自辦軍務以來,於發、撚投誠時,皆力主‘不妄殺,不搜贓’之禁令,弁丁犯者不赦。而於安插降眾一事,尤為盡心。即如克複肅州時,尚有不能盡行其誌者。”這既是告誡和批評部下,也是對自己未盡到職責的責備。
肅州既已克複,陝甘回事平定,進軍西域的要道已經打通,收複新疆的軍事行動於是提到日程上來了。左宗棠在5年前回答皇太後的提問時,說:“當以五年為期。”他率軍於同治七年底入陝,到同治十二年九月攻下肅州,正好是5年。一些朋友認為他太冒進,他事後也認為能如期完成計劃,是太僥幸了。