三川口战役后,宋廷罢免了范雍的职务,重新搭建陕西都部署司的领导班子,任命忠武军节度使、户部尚书夏竦为宣徽南院使、陕西经略安抚招讨使,全面主持陕西前线工作,又以益利体量安抚使韩琦为枢密直学士、陕西都转运使范仲淹为龙图阁直学士作为副使协助其工作。但韩琦和范仲淹的战略思想却大相径庭,韩琦主张出动大兵深入兴、灵讨伐元昊,范仲淹主张应该修筑堡垒,采取守势。两人争执不下,夏竦摆不平两位副使,只好让他们回朝辩论,朝廷也不知如何定夺,最后诏令一面修筑堡垒,一面准备主动出兵。
首先是分管鄜延路的范仲淹屡次主动出击,收复金明砦,并多次成功打击夏军重要的要塞和军工厂,其中两员小将部署葛怀敏和殿直狄青表现出色。尤其是狄青,后来率大军讨平广西侬智高起义,成为北宋唯一一位武夫出身的枢密使。范仲淹又采纳签署定国节度使判官(节度使副秘书长)种世衡的建议,在延州东北200里处修筑青涧城,成为一个坚实的堡垒,控制了延州北路。元昊派绥州厢主狗儿在青涧城对面修筑遮鹿城,结果被范仲淹遣兵马押监马怀德率军击败,狗儿将军战死。之后鄜延路占据青涧城,屡败夏军,西夏人充分认识到范仲淹的厉害,相互传诵:"无以延州为意,今小范老子腹中自有数万甲兵,不比大范老子可欺也。"大范老子指前面的范雍,小范老子即指范仲淹。
主张防守的范仲淹主动出击取得不错战绩,韩琦分管的环庆路却陷入防守。元昊派军攻破三川砦,进围镇戎军。最后在泾原军的支援下,环庆军才将夏军击退。顶住了元昊的第一波攻势,环庆路开始反击,趁元昊的精力都放在镇戎军方面,韩琦派出环庆部署任福率7000兵,从庆州出发,声言巡边,日暮时来到柔远砦,与当地蕃部宴饮,并戒令任何人不得离席,同时悄悄分派诸将行军70里向庆州东北100里处的西夏堡垒白豹城进发。天明时宋军有如神兵天降,出现在白豹城下,西夏守军毫无准备,大惊失色。此时任福也赶至城下亲自指挥,旋即攻破城池,收服荡骨咩等41个部族。白豹城是灵州的屏障,环庆、鄜延两路可以由此合兵进攻灵州,元昊不敢有失,连忙派兵急救,救兵到时宋军已经撤走,又派骑兵追击。任福派神木北路都巡检范全伏击,又斩首数百级。任福夜袭白豹城,一战成名,升为龙神卫四厢都指挥使、贺州防御使,成为夏军所嫉恨的名将。韩范两路到陕西后都取得不错战绩,当时流传一首歌谣:"军中有一韩,西贼闻之心骨寒。军中有一范,西贼闻之惊破胆。"
面对一连串的败绩,元昊焦头烂额,又使出求和的伎俩。范仲淹本主招抚,于是准备谈和,但韩琦认为"无故请和,必定有诈。"要求趁机进攻。争执不下又提交廷议,结果朝廷诏令韩琦的环庆路准备战斗,范仲淹的鄜延路按兵不动,夏竦直辖的泾原路也没有出兵。果然,庆历元年二月,夏军开始袭扰怀远城(今甘肃平凉)。韩琦忙令诸堡戒严,并调镇戎军驻军从后方包抄,选派了18000兵力,由任福率领,泾原驻泊都监桑怿为先锋。临行前,韩琦对任福等面授机宜,要求他们从后方包抄夏军,一定不能远离能够供粮的营寨,如果不便作战就据险坚守,千万不能冒进,缓行至羊牧隆城(今宁夏西吉县),与驻守的泾州驻泊都监王珪合兵后出击。任福一口答应,率军进发。
任福出兵不久,其所部的镇戎军西路都巡检常鼎、同巡检内侍刘肃就在怀远砦以南的张家堡遭遇夏军,夏军一触即溃,丢弃不少物资败去。任福见夏军败退,把韩琦的方案忘得一干二净,率轻兵猛追,日暮时追至六盘山下的好水川(大致在今宁夏隆德县以北),此地离羊牧隆城仅有5里,已乏食三日,人困马乏,在川口扎营。其余各部也渐次赶到,任福与桑怿在川口扎营,钤辖朱观、泾州都监武英率另一部在隔山相距5里的龙落川驻扎,约好第二天合兵继续追击。这时他们连续行军,已经非常疲顿,然而他们并不知道,他们已经堕入了元昊的佯败诱敌之计。
次日清晨,任福率军穿过川口,发现道旁有一些银泥盒,盒中噗嗤作响。任福令人打开盒子,旋即百余只白鸽从盒中飞出,盘旋于宋军上空。这正是元昊放在这里的信号,元昊坐在山顶,根据白鸽判断宋军的位置,以大旗指挥,铁骑四出,将宋军团团围住,竟有十余万众!(白鸽之说据《西夏书事》《长编》称在此地遇夏军大阵,不得不接战。按理说离羊牧隆城仅有5里时还要停下来扎营的可能性确实不大,白鸽很可能是后人演义出来的故事)此时任福等方知中计,只好全力抵抗。任福先派桑怿抵住夏军前锋,自结大阵御敌。然而不等大阵结成,又有不少伏兵杀出,很多宋军被赶下山崖,桑怿、刘肃在乱军中战死。任福身中十余箭,部将刘进劝他更换衣甲逃离,任福怒道:"吾为大将,兵败,以死报国耳!"使一把四刃铁简,与其子任怀亮挺身冲入敌阵决斗。士卒见状也无不报定尽忠之念,随任福决死,无一人逃亡,但毕竟寡不敌众,全部为国捐躯。
夏军全歼任福、桑怿部后立即合围武英、朱观部,这时羊牧隆城内的王珪也率4500军出援,在朱观的大阵以西结阵辅助,韩琦派出的渭州都监赵津也率2200骑赶到。由于这一部完成了阵形,所以夏军没有立即冲溃他们。元昊的用兵风格非常坚决,一旦遇到战机哪怕损失再大也决不放弃,夏军向宋军大阵发起了一轮又一轮的自杀式冲锋,战斗极其惨烈。王珪隐约看见任福的旗号还没有倒,准备出兵去救。军校犹豫不前,王珪拔剑斩之,向东京方向叩拜道:"臣非负国,力不能也,独有死耳!"策马杀入敌阵,一条铁鞭打得弯折,虎口尽裂,杀敌数百,战马三次中箭,三次换马,最后只能步战,犹杀敌数十,最后中飞矢而死。武英指挥大阵血战多时,身受重伤,情知必败,劝参军事耿傅道:"我是武将该死,你是文官,没有军责,何须与我们共死?"耿傅听后更加挺身在前,身中数枪而死。
耿傅在前一天就提醒任福、朱观要按韩琦的方略持重缓行,任福等不听,今日果然中伏大败。夏军前仆后继,终于将宋军东偏步兵阵冲破,整个大阵溃散,主将武英战殁。朱观率余下的千余士兵缓缓退到附近民兵营砦,借助民兵弓箭手勉强抵抗,坚持到了泾原部署王仲宝率兵来援,幸免一死。宋军共阵亡任福等指挥、军校以上的数百人,士卒六千余人。元昊又马不停蹄进攻刘璠堡(今宁夏海原),范仲淹遣环庆都监刘政率5000精兵救援,由于此前夏军损失已经很大,于是退回天都山休整。不久元昊又出兵秦州,被曹彬幼子秦凤路副都部署曹琮击退。
好水川之战元昊巧妙的引诱任福堕入其计,虽然代价比败方更大,但夏竦主政陕西后元昊连遭败绩,此战终于扳回一局,尤其是诛杀西夏人最嫉恨的名将任福,长出了一口恶气。西夏太师张元在边境的界上寺墙上题诗道:"夏竦何曾耸,韩琦未足奇。满川龙虎辈,犹自说兵机。"这里的"满川龙虎辈"就是指丢满山川的宋军尸体,非常得意。任福虽轻敌冒进,导致全败,但全军殉国,也让朝廷非常感动,追赠武胜军节度使、侍中,其余阵亡将领均有追赠。《西夏简史》称韩琦、范仲淹因此败也被贬官。这场大败也极大的挫伤了宋军的士气,所以悲天悯人的范文正公才会写出那篇最具凄美伤感情怀的边塞词《渔家傲》:
塞下秋来风景异,衡阳雁去无留意。四面边声连角起,千嶂里,长烟落日孤城闭。
浊酒一杯家万里,燕然未勒归无计。羌管悠悠霜满地,人不寐,将军白发征夫泪。