С сессией не все так однозначно. Например накликал юзер с поиска гугла несколько страниц сайта. Однозначно - внешняя ссылка. По первой странице будет - нет сессии/нет записи в сессии === пришли извне. А для других страниц не получится ли, что страницы "с внутренних страниц" ?
А для других страниц не получится ли, что страницы "с внутренних страниц" ?
Получится. По уму верный ответ будет "гарантированно - никак", но эти два механизма позволяют дать приблизительную точность определения. Реферер вообще не обязательный заголовок и его можно выключить или браузер его может не пересылать специально иногда, так что нет гарантированной схемы узнать перешел ли человек по ссылке внутри сайта или пришел по ссылке извне. Единственный более-менее действенный метод - генерация рандомных ключей, приписывать их в качестве гет параметров всем ссылкам на странице, а затем отслеживать их на другой странице. Но это уже из области редких извращений...