1857年底,英法联军侵占中国广州之后,英、法、俄、美四国公使又于1858年2月照会清廷,要求派出全权代表到上海进行谈判。3月,清政府对此予以拒绝。4月20日,四国公使带领军舰在大沽口外会合。24日,再次照会清政府,要求在北京或天津谈判。与此同时,进至大沽口外的英法联军舰队频繁地派船侦察地形,窥探炮台,测量航道,立标打靶,并向出海巡逻的清军水师射击。当时,驻守大沽口地区的清军约8000人,由直隶总督谭廷襄统领。其布防情况是在海口北岸设置炮台1座,南岸设置炮台3座,炮兵约3000人,火炮200余门,但这些炮都很陈旧。
5月19日,停泊在白河口的有英军舰艇15艘、火炮185门、官兵2052人;法军舰艇11艘、火炮164门、官兵600人。此外,还有美舰3艘,俄舰1艘。当夜,英法联军16艘舰艇及20余只满载陆战队的舢舨侵入拦江沙内,美、俄军舰各1艘跟进助威,20日8时,英、法公使发出最后通牒,要求清廷同意四国公使前往天津,并限令清廷在两个小时内交出炮台,否则以武力解决。10时,英法联军的6艘炮艇分成两队驶进大沽口内,同时炮击南、北炮台。接着,457名联军陆战队员向北岸炮台进攻,721名陆战队员攻打南岸炮台。
各炮台守军奋力抗击,击沉敌运兵舢舨4只,毙伤近百人。法军炮艇“霰弹”号遭重创,艇长被击毙,11人受伤。这时,清军水师向海口顺流放下50只大船、火筏,以攻击敌舰艇,结果被敌一一拨开,未能奏效。海口外边的联军舰只也用大口径炮轰击各炮台。北岸炮台的三合土顶盖被掀掉,南岸炮台的围墙被击塌,有的大炮被炸坏,清兵伤亡严重。11时许,两支陆战队都已强行登陆,逼近炮台,守兵冲出来同敌兵白刃格斗。在此危急关头,谭廷襄等将领乘轿逃走,后路清军溃散。防守北岸炮台的游击沙春元和防守南岸炮台的游击陈毅先后战死,各炮台相继失陷。敌炮艇趁势攻至东沽,焚毁了河上浮桥,并派兵占领了大沽东、西村。
5月26日,英法联军舰艇直抵天津城下,并扬言要进犯北京。清政府慌忙派员于6月中、下旬同俄、美、英、法四国代表订立了《天津条约》。7月,英法联军退出天津。
为了防止英法联军卷土重来,清政府在大沽加强了防御:科尔沁亲王僧格林沁到大沽主持军务;恢复了直隶海口水师2000人的编制;在南、北岸各建3座炮台,安置万斤以上的大铜炮11门,5000斤大铜炮2门,西洋铁炮23门,加上其他火炮共有60门;加固炮台防护,台外筑墙,墙外挖壕、树桩;在海口设置3道拦河铁链,安设木栅,配置铁戗;各营官兵加强训练,严密布防;另在双港驻兵,且修炮台13座,安设火炮81门;北塘驻兵1600人;招募团练、乡勇5万余众。
1859年 6月 17日,英法联军舰队以“换约”为名再次驶至大沽口外。这支舰队由新任英国侵华海军司令贺布少将指挥,共有舰船21艘。其中有英国军舰17艘、运输船2艘、陆战队1200人,法国舰船2艘、陆战队100人。此外,还有美舰3艘随同行动。贺布发现大沽口的设防情况后,派人向守军要求撤除海口的一切障碍,清军未加理睬,清政府通知英、法、美三国公使从北塘上岸进京换约,但被其拒绝。联军连日在海口侦察、破障、抢劫商船和渔船,并开炮挑衅。炮台清军在直隶提督史荣椿及大沽协副将龙汝元指挥下不动声色地监视敌人动向。
6月25日拂晓,贺布率领13艘舰艇向海口开来,到离铁戗不远处停泊后,派兵拆除铁戗和木栅,开辟通道。陆战队换乘抢来的中国帆船待命。15时左右,海口第1道障碍被清除后,由英舰“负鼠”号为前导前行,旗舰“鸻鸟”号等舰艇随后跟进,并开炮轰击两岸炮台。守军也突然开炮还击。接战不久,敌旗舰舰长拉桑等人被击毙,贺布也负伤,改乘大汽艇“鸬鹚”号继续指挥。激战到16时,参战的联军舰艇多数受到不同程度的损伤,旗舰“鸻鸟”号被击毁,“破风”号和“呼潮鸟”号2艘炮艇被击沉。“鸬鹚”号搁浅,贺布又换乘到法舰上,清军将“鸬鹚”号击毁。守军越战越勇,史荣椿、龙汝元等将土奋不顾身,相继阵亡。美舰也加入这场战斗,同样受到严惩,其旗舰“托依旺”号舰长被击伤。
17时,敌海军陆战队1000余人分乘舢舨、帆船20余只在舰炮火力掩护下,冲向南岸。登陆后,他们直冲炮台,受到守军的拦阻射击,在泥泞中爬行,难以前进。黄昏后,敌陆战队利用夜暗,匍匐前移。有少数敌兵爬到第1道沟壕边,可是带来的便桥太短,无法架设。清军集中火力向敌猛射,终于将敌赶回。经过一昼夜激战,敌方损失舰艇4艘,另有6艘受伤,英军伤亡578人,法军伤亡14人。清军仅伤亡32人,炮台遭到轻度破坏。这是自第一次鸦片战争以来中国军民抗击外国侵略军作战的一次重大胜利。
但是,英、法等国殖民主义者不甘心失败,蓄谋扩大侵略战争。1859年11月,英、法两国分别任命陆军中将格兰特和孟托班为英、法远征军总司令,重建英法联军。其中,英军18万人,法军7000人。1860年3月22日,英、法舰船18艘侵入舟山。5月27日,英军占领大连湾。6月8日,法军进占烟台,完成了对渤海湾的封锁。此后,英法联军就以大连、烟台作为进攻大沽口的前进基地。7月26日,英法联军舰船在渤海会合后,向大沽口外开进。其中,英军出动舰船173艘、兵力105万人;法军动用舰船33艘、兵力6300人。29日,联军舰船抵达大沽——北塘之间的沙垒田岛附近,在距海岸约13公里的海面待机,并进行侦察和测量。但是,清政府因第2次大沽之战获胜后盲目乐观,僧格林沁等将领也骄傲轻敌,竟把2万清军全部放在大沽口,而在北塘却不设防。
8月1日,联军舰艇30余艘,护送陆军5000余人进攻北塘,因该地守备空虚而顺利登陆,并占领了北塘镇。后续部队也相继上陆,在大沽的僧格林沁没有及时派兵阻击,仅派马队“遥为屯扎”,并下令“不得先行还击”,以致坐失抗登陆的良机。
8月7日,清政府要求谈判。英、法公使予以回绝,并强令清军交出大沽各炮台。8月12日拂晓,联军万余人从北塘出发,途中分成左、右两路纵队分别攻击新河、军粮城。9时,新河清军马队2000人对敌右路部队进行反击。马队遭到敌炮火轰击后,又被其步兵包围。交战不久,马队伤亡近400人,只得突围。联军骑兵紧追不舍,清军马队大部被歼,新河失陷。
8月14日晨,联军由新河向塘沽进逼。塘沽是大沽口北岸炮台的侧后屏障,筑有高7米、长近2公里的围墙。墙上开有火炮射口和枪眼。加上新河清兵,共有守兵约3000人。6时,联军到达塘沽附近。白河中的清军水师战船立即开炮拒敌。双方炮战半小时,水师不支而退。7时30分,联军炮轰塘沽,随即发起总攻,守军拼死抵抗。2小时后,联军一部泅水从苇塘迂回到塘沽侧后,守军腹背受敌,退至大沽口北岸炮台,塘沽陷落。这时,英法联军舰艇在大沽口外云集,准备配合陆军夹击大沽炮台。清朝廷已丧失守卫海口信心,再次求和又遭拒绝。
8月21日5时,英法联军集中所有舰炮和野战炮一起向北岸炮台猛轰。守军虽开炮还击,但炮位上的射口多是朝海口方向开的,无法向侧后的联军回击。各炮台的弹药库先后中弹爆炸,守军炮声逐渐稀疏。8时之后,炮战告停。1万余名联军步兵分2路冲锋,以英军为左路,以法军为右路,首先进攻石头缝炮台。直隶提督乐善督众用鸟枪、抬枪和弓矛等奋勇杀敌。9时许,炮台被炸,乐善和守兵大部阵亡,炮台被敌夺占。北岸另外2座炮台也在激烈争夺后失守。北岸作战,清军损伤近1000人,联军死伤400人。
僧格林沁见到北岸炮台尽失,认为南岸也“万难守御”,当晚带兵撤往天津。直隶总督恒福把南岸炮台拱手交给英法联军。
大沽失陷后,贺布又率领5艘炮艇和80余名陆战队官兵,溯白河长驱直入。僧格林沁又带领双港、天津一带清军17万人退到通州。8月24日,敌炮艇驶至天津近郊,未经战斗,英法联军就占领了天津。9月18日和21日,英法联军又在通州附近的张家湾和八里桥击溃僧格林沁等部数万清军,兵临北京城下。
10月13日,英法联军攻入安定门,控制了北京城。终于迫使清廷签订了丧权辱国的《北京条约》。