Milan åkte till Portugal och var nära en smäll redan efter fem minuters spel. Luis Diaz visade prov på fin teknik när han tog sig fram och avlossade ett tungt skott som gick i vänsterstolpen.
Strax före halvtid fick det italienska storlaget en chans att gå in i halvtidspausen i ledning. Alexis Saelemaekers serverade nickstarka Olivier Giroud, som fick en panna på bollen, men Diogo Costa i Porto-målet stod rätt och plockade in bollen.
Lagen gick ut i halvtidsvilan till 0-0.
Svensken hoppade in
Zlatan Ibrahimovic byttes sedan in i med dryga halvtimmen kvar. Framträdandet var svenskens 121:a i Champions League, och det första sedan matchen mot Basel i Manchester United-tröjan den 22 november 2017.
40-åringens inhopp hjälpte dock föga.
Efter en tveksam situation där Milans Ismaël Bennacer gick omkull vid straffområdeslinjen fick Diaz en gyllene chans – som han förvaltade väl. Yttern drog till med ett distinkt avslut på ett tillslag och skottet var otagbart för Ciprian Tatarusanu i Milans mål. Porto vann matchen med 1-0.
– Det finns inga ursäkter. Vi gör en dålig match och vi får ta igen det under de återstående matcherna, säger Zlatan Ibrahimovic efter matchen.
De rödsvarta har nu tre förluster på lika många matcher i Champions League. Porto tog säsongens första seger i turneringen.
Ett returmöte väntar den 3 november.
KLIPP: Ibrahimovic inleder på bänken i Champions League (18 oktober 2021)