@dpr дал неплохой совет, но если так уж хочется скрыть кухню от пользователя, то почему бы не воспользоваться встроенными в протокол HTTP возможностями?
На стороне клиента
xmlhttp.setRequestHeader('Accept', 'application/json');
На стороне сервера
if ($_SERVER['HTTP_ACCEPT'] == 'application/json') {
// тут генерируем JSON
} else {
// тут генерируем HTML
}
Использование HTTP-заголовка Accept предпочтительнее, чем HTTP_X_REQUESTED_WITH, потому что
- вы точно знаете, что передали заголовок ручками, а не полагаетесь на разработчиков браузера,
- используете более старую и устоявшюся (но не устаревшую) возможность, встроенную в протокол,
- оставляете себе задел на использование других представлений, например, XML, CVS, Plain text и т. д.