2015-08-22 9 views
0

Я пытаюсь настроить небольшой сервер Silex RESTFul, и теперь я играю с HTTP-заголовками.Silex дает пустой ответ, если код состояния HTTP! = 200

Один GET функция проверяет If-Modified-Since заголовка и сравнивает с Last-Modified элемента базы данных.

Вот небольшой пример кода:

if($hasModifications){ 
    $response = [items] 
    $statusCode = 200; 
} else { 
    $response = ['result'=>'no modifications']; 
    $statusCode = 304; 
} 
return $app->json($response,$statusCode,$headers); 

Когда $ StatusCode = 200, я только получаю пустую страницу, а также не специальный заголовок не отправляется!. Это также нарушает CORS, потому что я не могу установить заголовок Access-Control-Allow-Origin.

Должен ли я делать это по-другому?

(PS: это не реальный код, а также, если я заменю $ StatusCode за 200, то все работает снова, как обычно)

Update: До сих пор, я думаю, от чего я 'читал, что 304 статусов не должны посылать что-либо на тело ответа. Но как насчет заголовков? Если я не соглашусь с CORS, тогда Frontbound у меня не получится, и я не смогу поймать исключение «Not Modified» !. Очевидно, я могу понять это по-другому. Но было бы неплохо, если бы я мог нормально работать (REST + CORS).

Update 2:

var_dump($headers) 
array(4) { 
    ["Last-Modified"]=> string(29) "Fri, 21 Aug 2015 22:47:53 GMT" 
    ["X-Status-Code"]=> int(304) 
    ["Cache-Control"]=> string(25) "post-check=0, pre-check=0" 
    ["Pragma"]=> string(8) "no-cache" 
} 

Обратите внимание, что я использую X-Status-Code сообщить истинную HTTP статуса. Прямо сейчас, ответ строка кода выглядит следующим образом:

return $app->json($response,200,$headers); 

Если я изменил на , я не могу видеть вывод var_dump (дает мне пустую страницу). Также, если я установил статус 304 без параметра заголовка, он все тот же. Похоже возвращение или $ app-> JSON очищает HeaderBag, так как я использую JDesrosiers \ Silex \ Provider \ CorsServiceProvider(), и эти параметры заголовков также списываться.

Это ответ Raw HTTP взят из Firefox с кодом состояния :

Cache-Control: post-check=0, pre-check=0, private 
Connection: Keep-Alive 
Date: Sat, 22 Aug 2015 19:52:18 GMT 
Keep-Alive: timeout=5, max=100 
Server: Apache/2.4.7 (Ubuntu) 

И это, с кодом состояния :

Cache-Control: post-check=0, pre-check=0, private 
Connection: Keep-Alive 
Content-Length: 25 
Content-Type: application/json 
Date: Sat, 22 Aug 2015 19:53:12 GMT 
Keep-Alive: timeout=5, max=100 
Last-Modified: Fri, 21 Aug 2015 22:47:53 GMT 
Pragma: no-cache 
Server: Apache/2.4.7 (Ubuntu) 
X-Powered-By: PHP/5.5.9-1ubuntu4.11 
X-Status-Code: 304 
+0

Вы можете разместить вывод '' '' var_dump ($ headers) '' '? – mTorres

+0

Добавлен var_dump ($ headers), некоторые другие тесты и исходные ответы HTTP в обоих случаях (200 и 304) в редакции. – Padlite

ответ

1

Apache обрежет CO заголовки на 304 кодов состояния.

Вы можете прочитать больше в выпуске #51223, и вы также можете найти исправление, которое исправит эту проблему.

Если вы не хотите или вы не можете перекомпилировать Apache, вы можете попробовать запустить Nginx, который оставит заголовки CORS на месте.

+0

О, это очень неудачно .. Я могу переключиться сюда на мою локальную настройку, но это будет работать на общем хосте, поэтому я не могу этого сделать. Даже если я установил эти параметры через .htaccess, они будут удалены? Пока что решение для этого устанавливает статус 200 и отправляет заголовок X-Status-Code с правильным значением. Спасибо, Александру. – Padlite

+0

Согласно [RFC 2616] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5), 'если условное GET использовало сильную проверку достоверности кеша, ответ НЕ ДОЛЖЕН включать другой объект -headers.'. И поскольку заголовки CORS не распознаются, они рассматриваются как заголовки объектов. (см. [Раздел 6 из RFC 2616] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html)). Итак, с моей точки зрения, Apache следует спецификации. Тем не менее, у вас есть дополнительная информация о том, как настроить Apache для CORS на веб-сайте [enable-cors.org] (http://enable-cors.org/server_apache.html). –

Смежные вопросы