Чтобы правильно понять, на время забудем об Ajax. Львиная доля обращений происходит к индексному файлу, который соберет в кучу работу многих файлов и родит страницу клиенту. А результатом этих родов будет являться html код страницы для клиента. Для РНР же, это в общем-то просто строка, длинная предлинная, которая как минимум будет начинаться с тега <html>. А чтобы заставить родить сервер эту строку, пользователь делает GET запросы.
Это понятно же?
А что если, к примеру, клиенту нужно после загрузки страницы, сделав обычный GET запрос с параметром получить картинку, которую сервер приготовит налету, то есть физически на сервере ее не существует, она рождается по запросу. Что делают? Правильно, делают такой запрос к файлу, который только эту задачу и исполняет.
А что если запросить эту картинку у индексного файла, поместив в его код и вывод этой картинки, что произойдет? Правильно, наряду с выдачей картинки клиент получит опять и длинную строку html кода страницы. При этом как таковая картинка не будет видна, будет ошибка и картинка будет передана как цепь непонятных каракулей текстовых.
Это понятно почему происходит?
Но означает ли это, что нельзя запросить картинку и индексного файла, да вообще у любого иного, который также делает вывод в браузер? Нет не означает, но для этого нужно просто грамотно расположить код на странице. Причина то проблемы ясна, значит и не должно быть затруднений в том как ее устранить. Вот такая структура кода должна быть:
<?
//если запрашиваем картинку у страницы, которая ее же и породила
//то есть отдала клиенту ее код, то обработчик запроса картинки
//должен быть расположен до любого вывода в браузер
//не считая заголовков
//------------
//обрабатываем GET запрос ?picture=25 на картинку
if($_GET['picture']) {
//тут код создания картинки и вывода ее клиенту
//после чего обязательное завершение работы скрипта
exit;
}
//а если был просто запрос этой страницы, без указанного параметра
//то будет вывод страницы в браузер, кода ниже
?>
<html>
<head>
......
То же самое происходит и с Ajax, если не соблюдать вышеописанной логики. Разница только в том, что без Ajax страница будет перегружена, а с Ajax нет, ответ будет получен в некий контейнер.
Замените в описанном выше PHP код в начале страницы на свой, который обрабатывает Ajax запрос, и все будет работать без проблем. Никто не запрещает делать запросы и к отдельным страницам, которые будут обрабатывать только их, в этом случае, что понятно, делать выход в скрипте и не потребуется.