光緒十年,應越南阮氏王朝請求,清政府派軍駐紮越南。七月法軍向清軍進行武裝挑釁,清朝政府決定正式向法國宣戰,中法戰爭爆發。
光緒十一年一月,法軍在中越邊境發動大規模的進攻,並占領了廣西門戶、西南重鎮鎮南關(今友誼關),打算以此為突破口,進一步占領中國南部。
為了打擊侵略者的囂張氣焰,馮子材率領軍民在鎮南關內十裏關前隘修築防禦工事,積極備戰。關前隘形勢十分險要,兩邊是崇山峻嶺,中間是一條狹窄的通道,關口易守難攻,戰略地位極為顯著。
馮子材率領軍民在隘口前搶修了一道三丈多長的長牆,把東西兩嶺圍在牆內,牆外挖了深壕,山嶺險要處構築炮台,居高臨下,威勢無比,使敵人不敢接近。
同時又進行了周密的軍事部署:王孝祺、蘇元春、王德榜等將領分別率軍駐守山口周圍各處,交戰時相互接應。自己率軍守衛長牆和山嶺要地。在組織軍民同心抗敵外,還同關外中越人民取得聯係,以求共同抗戰殲滅敵人。
法軍統帥尼格裏從文淵城調集軍隊分兩路趁天降大霧之機向關前隘撲來。一路進攻東嶺炮台,一路直奔長牆。在大炮的掩護下,法軍攻占了東嶺炮台,然後在東嶺炮台用大炮轟塌了長牆,關前隘法軍持槍衝將過來。戰士們英勇奮戰。正在危急關頭,王孝祺率軍從小路繞到敵人側麵攻打法軍。
此時,蘇元春率領軍隊趕到,冒著槍林彈雨登上東嶺,攻占了部分炮台,向法軍開炮轟擊。駐守關東的王德榜聽到大炮轟鳴聲,按馮子材事先部署,率兵去圍攻文淵城,截斷法軍後路。法軍派出的運送食品彈藥的車隊多次被王德榜的軍隊擊退,斷了補給的法軍軍心大亂。
垂死掙紮的法軍向長牆又一次發動了瘋狂的進攻。馮子材殺向敵群,與法軍展開短兵相接的肉搏戰。攻打長牆的侵略軍頓時陣勢大亂,很快便全線崩潰。但是,占據東嶺炮台的法軍仍不甘心,企圖負隅頑抗。馮子材指揮軍隊發動了七次攻堅戰,都未能拿下。
不久,王孝祺率軍繞到東嶺邊,與馮子材前後夾擊法軍,最終將東嶺奪回。
東嶺、長牆潰敗後,中越人民援軍趕到,法軍倉惶向文淵城逃去。
馮子材決定不給敵人以任何喘息時機,率領軍民乘勝追擊,很快收複了被侵略軍強占的文淵、涼山、穀鬆、屯梅,直指北寧。北寧的兩萬多的越南人民組成“忠義”團,打起“馮”字旗號,抗擊法軍。在中越軍民的沉重打擊下,法軍狼狽逃竄到船頭、郎甲一帶。至此,鎮南關戰役大獲全勝。