Короче говоря: можно скрыть, какой язык вы используете в бэк-энде. Тривиальный пример: рассмотрим страницу «Hello World»; было бы чрезвычайно сложно выяснить, какой фреймворк / язык использовался на бэкэнде (при условии, что базовые вещи, такие как сеансовые куки-файлы, установлены вручную или не используются).
Однако смысл фреймворков заключается в том, чтобы избавить вас от необходимости повторной реализации функциональности и заставить вас работать стандартизированным образом. Почти у всех платформ есть свои специфические маленькие контрольные сигналы, которые выдают их, если вы посмотрите достаточно близко. Как уже отмечали другие, можно попытаться скрыть их, используя конфигурацию или повторно реализуя различные стандартные функции. Тем не менее, я бы сказал, что для больших сайтов будет крайне сложно полностью спрятать все, и даже если вы достигнете этого, вы будете использовать очень мало своей инфраструктуры.
Подводя итог, я бы сказал, что почти всегда можно получить очень хорошее представление о том, что используется под ним (с некоторым тщательным изучением и подталкиванием). Скрытие используемой основы возможно, но быстро становится невозможным для больших площадок.
В предыдущих ответах есть несколько хороших примеров различных контрольных сигналов, которые есть у фреймворков и языков. Я хотел бы добавить, что различные механизмы представления имеют специфическое поведение, связанное с пробелами, которое может использоваться для их идентификации. Движок Razor, используемый в MVC3 +, имеет некоторые довольно специфические причуды, которые могут быть использованы для его идентификации или, по крайней мере, для сужения списка подозреваемых (опять же, вы можете обойти его, но потом, используете ли вы его?).
.php
CGI-Script, написанный на C, или Servlet, написанный на Java.