同年九月,经过一番积极筹措之后,肃宗再次发起了向长安的进攻。为了增强实力,唐廷向回纥求援。怀仁可汗遣其子叶护及将军帝德,将精兵4000余人至风翔。九月十二日,元帅广平王李做,将朔方等军及回纥、西域之众凡15万,号20万,从风翔出发。二十七日,诸军至长安西,陈兵于香积寺北沣水之东。官军以李嗣业为前军,郭子仪为中军,王思礼为后军。叛军10万陈于其北。叛将李归仁挑战,官军出击,叛军齐进,官军惊乱退却。李嗣业见情势危急,乃肉袒,执长刀,立于阵前,大呼奋击,连杀数十人,阵乃稍定。于是,嗣业帅前军务执长刀,排阵如墙,并力前进。嗣业身先士卒,所向披靡。战将王难得头部中箭,皮垂障目,王难得用手拔出箭头,掣去其皮,血流被面,鏖战不已。叛军伏精骑欲袭官军之后,朔方军战将仆固怀恩引回纥兵掩击,翦灭殆尽。嗣业又与回纥兵袭叛军阵后,同官军大部队郭子仪、王思礼两面夹击。从正午至傍晚,激战三个时辰,斩首6万余级,填沟堑壑,死者不计其数。叛军溃不成军,残兵败将逃回长安。翌日(二十八日)凌晨,叛军安守忠、李归仁等,弃长安东遁,官军浩浩荡荡进入长安。克复长安以后,唐军乘胜前进,长驱迫蹑。郭子仪引蕃汉兵追叛军至潼关,斩首5000级,并克华阴、弘农2郡。
十月初,官军再次与安军主力决战于陕县(今河南三门峡市)西之新店,安军又大败。安庆绪不得不放弃洛阳,走保邺城(今河南安阳市)。自是长安、洛阳东西两京终归唐有。
两京收复之后,肃宗、玄宗先后回到了京师长安。为了便于处理政务,肃宗入居大明宫,玄宗则退居兴庆宫。
安庆绪退至邺城,收集败卒,尚有众7万。虽属残余势力,也不可小视。唐廷为了彻底消灭叛军,于乾元元年(758年)九月,命郭子仪、李光弼等九节度使会师围邺。由于九节度不相上下,未设统率,无人指挥,虽各自有小胜,终难以成大功。安庆绪窘急,求救于史思明,且请以位让史。
史思明乘机于范阳率兵13万救邺。乾元二年(759年)三月,官军步骑60万与安史军交战于安阳河北。因战略战术上的失误和天气形势的不利,官军大败,诸节度各溃归本镇,实力损失1/4。史思明借故杀掉安庆绪和他的四个弟弟及其党羽,收夺安军余部,实力大增。
同年四月,史思明在范阳自称大燕皇帝。九月又率军南下,再度攻占洛阳。上元二年春,唐命李光弼由河阳发兵收复洛阳,结果反为史思明所败。史思明乘胜西攻潼关,因其虐待部下,内部离散,史思明为其子史朝义所杀。朝义还军洛阳即位。安史旧部不肯听他指挥,叛军实力趋于瓦解。
宝应元年(762年)秋,唐再次借回纥兵平叛。十月,以雍王李适为元帅,会合诸道节度使及回纥兵于陕州(今河南陕县),进讨史朝义。在洛阳北邙山下,朝义大败东走,逃往幽州,叛军部下陆续降唐。广德元年(763年)正月,朝义逃至范阳,走投无路,穷蹙自杀。安史叛乱,至此结束。