@koa_t

Не работает pjax в Yii2 из-за символа '\0' в headers на php 7.0.13?

Для корректной работы pjax необходимо иметь в заголовках X-Pjax и X-Pjax-Container.
В \yii\widgets\Pjax заголовки получаются следующим образом:

$headers = Yii::$app->getRequest()->getHeaders()

Если подробнее посмотреть в \yii\web\Request метод getHeaders, то заголовки получаются с помощью php функции getallheaders().

Так вот, проблема возникла в этом месте. На локальном веб-сервере, при разработке на PHP 7.0.13, функция возвращает верные заголовки и соответственно pjax отрабатывает верно. Но при переносе проекта на хостинг pjax перестал отрабатывать: в ответ приходило 200, но ответ был пустой - и поэтому страница перезагружалась.

Когда начала разбираться и дошла до функции getallheaders(), выяснилось, что на сервере эта функция возвращала массив, в котором в названии параметра добавлялся символ '\0'.

То есть, что должно приходить:
'Accept' => 'text/html, */*; q=0.01'
 'X-Requested-With' => 'XMLHttpRequest'
 'X-PJAX' => 'true'
 'X-PJAX-Container' => '#pjax'


А приходит:
'Accept\0' => 'text/html, */*; q=0.01'
 'X-Requested-With\0' => 'XMLHttpRequest'
 'X-PJAX\0' => 'true'
 'X-PJAX-Container\0' => '#pjax'


На хостинге тоже версия PHP 7.0.13. К тому же, были протестированы на том же хостинге и на разных заказах более поздние версии php (5.4, 5.6) - pjax работает и заголовки приходят нормальные, т.е. не работает именно при php 7.0.13 (смотрела на разных заказах). Так же yii2 и pjax протестировала на совершенно другом хостинге с той же версией php и там все работает.

То есть получается проблема в самом php на этом хостинге?

Списывалась с тех.поддержкой. Те разводят руками, и говорят, что мало информации и необходимо предоставить требования к спецификации php.

Посоветуйте куда смотреть? Какие именно требования должны быть, ведь, как я понимаю, это касается каких-то глобальных настроек php? В принципе, проблема решается простым str_replace, но это изменение в основных файлах самого фреймворка, и это нехорошо в целом, да и в частности хотелось бы иметь возможность yii обновлять.
  • Вопрос задан
  • 235 просмотров
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
возможно дело в php, а возможно в сервере. Проверьте отправляет ли pjax 'X-Requested-With\0' или 'X-Requested-With'. А потом отправьте на обычный php без yii и посмотрите как там. Можно решить проблему, переписывая header до подключения yii.
Так же я бы проверил php+apache и php + nginx что бы определить дело в сервере или в php.
Ответ написан
@koa_t Автор вопроса
У хостера появилась новая версия php 7.1.0, перешла на нее, там getallgeader() возвращает все правильно без лишних символов. На версии 7.0.13 проблема осталась у них.
Так же мне на другом ресурсе, где я тоже задавала вопрос, скинули ссылку https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=..., там была такая же проблема для php 5.6.0 и даже там есть фикс. Попробую отписаться хостеру, но для себя считаю проблему решенной.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы