Или правильны оба варианта? Но тогда в чём разница?
Правильны оба варианта – и с тем, и с другим предлогом. Можно употреблять любой из них, например:
We heard a knock at the door – Мы услышали стук в дверь
We heard a knock on the door – Мы услышали стук в дверь
Но какая-то разница должна быть!
Нет, никакой разницы нет. Это как по-русски – «стук в дверь» и «стук по двери». Да, в русском мы говорим только «стук в дверь», но в английском можно и «по двери» сказать.
И это касается не только двери – то же самое мы можем сказать о любом другом предмете, по которому можно постучать, например:
a knock at the window = a knock on the window – стук в окно
Глагол knock, к слову сказать, имеет абсолютно такое же, двойное управление – to knock at/on something, например:
Someone knocked at the door = Someone knocked on the door – Кто-то постучал в дверь
Поскольку этот вопрос часто возникает, решили осветить его.