Обычно ставится "заглушка" в .htaccess, которая приводит к тому, что любой запрос на самом деле запускает index.php. Далее берётся значение $_SERVER['REQUEST_URI'] и разбирается на части.
Например, в случае с /images/5 я бы сделал так
<?php
// index.php
$uri = $_SERVER['REQUEST_URI'];
$a = explode('/', $uri);
// Теперь в $a имеем следующее:
// array("", "images", "5");
// Анализируем $a[1], там должно быть images
switch ($a[1]) {
case 'images':
// Получаем ID картинки
$img_id = $a[2];
// Далее проверяем $img_id на валидность (is_numeric($img_id)), делаем запрос в БД и всё остальное, чтобы вытащить картинку и вывести её.
break;
case '.....':
// Обработка разных других ссылок
.......
break;
}
.........
?>
Если Вы хотите ещё и категорию, то можно сделать так
/images/sea/5
/images/mountains/10
/images/footage/45
просто в массиве $a тогда будет $a[1] - это категория, а $a[2] - это ID картинки.
Задание параметров внутри ссылки во-первых намного лучше с точки зрения безопасности (потому что не видна реальная структура файлов в вашем приложении), во-вторых, такие ссылки намного лучше индексируются поисковиками.