Браузеры меняют теги местами в файлах, выводимых коханой

Flok

Новичок
Попытаюсь подробнее расписать то, что происходит.
Изучаю фреймворк кохана. Обнаружил странное поведение браузеров при работе с ней.

Суть:
Есть файл test.php

PHP:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Проверка</title>
</head>

<body>
</body>
</html>
По сути - самый элементарный шаблон файла.
Есть контроллер:
PHP:
class Controller_A extends Controller_Template {
 
    public $template = 'test';
    public function action_index()
    {

    }
 
} // End A
Тоже проще быть не может.

А теперь главное: при заходе на эту страницу (/a/) почему-то все браузеры до единого "исправляют" вёрстку и переносят все теги из head в body.
получается такая вёрстка:

PHP:
<html>
<head></head>
<body>

    <meta charset="utf-8">
    <title>Проверка</title>
</body>
</html>
Ко всем проблемам ещё появляется пустая строчка сразу в начале body. Из-за этого начинала разъезжаться вёрстка.

Но самое странное что: если запросить такой же файл по прямому адресу /папка/test.php , то браузеры оставляют вёрстку как есть.

Я уже думал, что кохана каким-то способом сама меняет расстановку тегов. Но нет, посмотрел буфер сервера перед выводом страницы - все теги в нужном порядке. (буфер смотрел сбором инфы через ob_start и дальнейшей распечаткой переменной через var_dump). Посмотрел, что приходит на браузер - визуально тоже всё в порядке. То есть браузеры меняют теги местами уже после того, как получают код.

Единственное, что отличается в получаемых браузером данных, это http-заголовки.
в случае прямого запроса файла они выглядят так:

PHP:
Accept-Ranges	bytes
Connection	Keep-Alive
Content-Length	127
Content-Type	text/html
Date	Sat, 18 Aug 2012 16:50:19 GMT
Etag	"300000006c776-7f-4c78d1209e132"
Keep-Alive	timeout=5, max=100
Last-Modified	Sat, 18 Aug 2012 16:50:13 GMT
Server	Apache/2.2.21 (Win32) PHP/5.3.8
В случае запроса через кохану так:
PHP:
Connection	Keep-Alive
Content-Length	133
Content-Type	text/html; charset=utf-8
Date	Sat, 18 Aug 2012 16:50:56 GMT
Keep-Alive	timeout=5, max=100
Server	Apache/2.2.21 (Win32) PHP/5.3.8
X-Powered-By	PHP/5.3.8

Я уже не знаю, что мне делать. Может подскажете, как решить проблему, или хотя бы её диагностировать?

UPD: кохана версии 3.2
 

WMix

герр M:)ller
Партнер клуба
PHP:
class Controller_A extends Controller {
 
    public $template = 'test';
    public function action_index()
    {

    }
 
} // End A
а если так?
 

Flok

Новичок
WMix
так не рендерится. добавил в экшн

PHP:
$this->template = View::factory($this->template);
$this->response->body($this->template->render());
но ошибка осталась.

странно, но если создать ещё несколько хтмл файлов с разными именами, и при этом в контроллере поменять название макета, то в половине из них вёрстка будет нормальной, в другой половине - искажённой.

чертовщина какая-то.
 

fixxxer

К.О.
Партнер клуба
1) раз умеешь смотреть хедеры - посмотри и передаваемоое тело. Для убедительности wireshark-ом.
2) Выложи в инет, мы все зайдем посмотрим. Скорее всего убедимся что все нормально, после чего отправим тебя расчищать говноплагины/говнофаерволы/вирусню.
 

WMix

герр M:)ller
Партнер клуба
а если так
PHP:
class Controller_A extends Controller {

    public function action_index()
    {
        $this->request->response = View::factory('test');
    }
 
}
 

Flok

Новичок
Здесь демонстрация проблемного места (смотреть через фаербаг и т.п. штуки)

а с wireshark не работал раньше, сейчас не осилил, как в нём трафик посмотреть. вбивал в фильтр http, загружал страницу, но нужных заголовков так и не нашёл >_<

ещё прицеплю на всякий случай папку проекта.
 

Вложения

  • 1.015,6 KB Просмотры: 2

Flok

Новичок
Crys
Не знал о bom до этого момента.
Для решения проблемы надо только пересохранить файлы без подписи bom? а это не отразится на правильности их прочтения?


UPD: удалил все bom. теперь вёрстка не разъезжается. уже доволен результатом. спасибо )

но всё же осталось чувство, что с bom тоже как-то должно было работать. не зря же его придумали )
 

Crys

Двинутый новичок
но всё же осталось чувство, что с bom тоже как-то должно было работать. не зря же его придумали )
По спеке перед доктайпом не должно быть никаких символов.
В твоем случае из-за bom не определяется доктайп, браузеры переходят в режим совместимости.. честно, не знаю тонкостей, но тут у тебя содержимое head выпихивается в body, head переписывается пустым.
В общем, либо убирай доктайп, либо не используй BOM.
 
Сверху