在郭子仪奉命回到朔方后,立即招兵买马,补充兵员,试图从正面战场出击叛军,以收复洛阳。仔细分析战况后,郭子仪认为,必须夺取河北各郡,切断洛阳与安禄山老窝范阳之间的联系,绝其后方供给线,才能有效地打击叛军前线的有生力量。郭子仪首先率军击溃了振武军(今内蒙古托克托)的安禄山叛军,紧接着收编了靖边军,击败了河曲(今山西永济西)叛将高秀岩,收复云中(今山西大同)、马邑(今山西朔县)两郡,打通了东进的道路。同时郭子仪推荐李光弼(契丹人)为河东节度使,令其率军由太原出井陉口(今河北省井陉县),进入河北中部,收复常山(今河北正定)。史思明闻讯后,亲率两万骑兵从西包围李光弼,争夺常山,双方激战四十多天,均无法取胜。李光弼又因史思明截断了常山粮道,被迫困守,并派人向郭子仪求援。四月,郭子仪急率军出井陉,与李光弼合兵十余万,在常山西南九门县(今河北省藁城西北)大败史思明,然后乘势攻入赵郡(今河北赵县)。
安禄山闻听史思明大败,恼羞成怒,当即派遣蔡希德率精锐骑兵两万前来增援史思明。史思明收集逃散士卒,与援军合兵五万,气势汹汹直逼郭子仪、李光弼驻守的恒阳(今河北曲阳)。郭子仪见叛军来势凶猛,不可一世,为了避敌锋芒,实行疲敌政策,一方面深沟高垒,加强工事,积极做好反攻准备;一方面采取敌来则守、敌去则追的战略战术,白天耀武扬威,夜里偷袭敌营,不给叛军以喘息的机会。史思明的将士由于无法休息,双方对阵几天后,叛军疲惫不堪,士气低落。郭子仪见歼敌的时机已到,与李光弼率军奋然出击,在恒阳境内的嘉山再次大败史思明,杀敌四万余人,俘虏千余人,缴获战马五千匹。叛军首领史思明中箭落马,丢盔弃甲狼狈逃回营中。郭子仪、李光弼率军乘胜追击,围史思明于博陵(今河北定县)。嘉山一战,唐军声名大振,河北中部十余郡的地方官和军民纷纷起来诛杀叛军官吏,归顺朝廷。