Изображения сохраняются в директорию images/. Можно ли как то запретить прямой доступ по url, но дать возможность выводить с помощью тега img?
Я думал над альтернативным способом, но не уверен реализуемо ли, хранить картинки на уровень выше корня сайта. С помощью header заголовков получать изображения, преобразовать в base64 и отдавать клиенту в тег img.
Можно ли как то запретить прямой доступ по url, но дать возможность выводить с помощью тега img?
Нельзя.
Какой-то особенный "прямой доступ" - это очень распространенное суеверие. В реальности же никакого "кривого доступа" не существует.
И запретив "прямое" ты просто запретишь любые обращения вообще.
Поэтому любые фантазии про "закрыть прямой доступ но позволить бразуеру запрашивать" не имеют смысла.
Надо купить книжку Котерова, РНР7, и прочитать с самого начала. Там даются основы протокола НТТР, как раз для таких вот самоучек, которые всё изучают методом тыка.
Если же тебе нужно отдавать какую-то информацю в зависимости от каких-то условий (например только авторизованным пользователям), то именно такой вопрос и надо задавать. В этом случае вариант "хранить выше корня сайта и отдавать скриптом" вполне подойдет
Продвижение своими сайтами как стратегия роста и независимости