如果 HTTP 状态代码 != 200,Silex 给出空响应
Silex gives empty response if HTTP Status code != 200
我正在尝试设置一个小型 Silex RESTFul 服务器,现在我正在使用 HTTP Headers。
一个GET函数检查If-Modified-Sinceheader,并与数据库的[进行比较=74=]项。
这是一个小代码示例:
if($hasModifications){
$response = [items]
$statusCode = 200;
} else {
$response = ['result'=>'no modifications'];
$statusCode = 304;
}
return $app->json($response,$statusCode,$headers);
每当 $statuscode!=200,我只会收到一个空白页面,也不会发送自定义 header。这也破坏了 CORS,因为我无法设置 Access-Control-Allow-Origin header.
我应该用其他方式吗?
(PS:这不是实际的代码,而且如果我将 $statusCode 替换为 200,那么一切都会恢复正常)
更新:
到目前为止,根据我一直在阅读的内容,我猜想 304 状态不应该在响应 body 上发送任何内容。但是 headers 呢?如果我不遵守 CORS,那么 AngularJS 前端将失败,我将无法捕获 "Not Modified" 异常!。
显然,我可以通过其他方式解决。但是,如果我能让这两件事都正常工作(REST+CORS)就好了!
更新二:
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);
如果我将 200 更改为 304,我看不到 var_dump 的输出(给我一个空的页)。另外,如果我在没有 header 参数的情况下设置 304 状态,它仍然是一样的。
似乎 return 或 $app->json 清除了 HeaderBag,因为我使用的是 JDesrosiers\Silex\Provider\CorsServiceProvider(),那些 headers 参数也被清除。
这是从 Firefox 获取的原始 HTTP 响应,状态代码为 304:
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)
还有这个,状态码 200:
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
Apache 在 304 状态代码上去除了 CORS headers。
您可以在问题 #51223 中阅读更多内容,您还可以找到解决此问题的补丁。
如果您不想或不能重新编译 Apache,您可以尝试 运行 Nginx,它将保留 CORS headers。
我正在尝试设置一个小型 Silex RESTFul 服务器,现在我正在使用 HTTP Headers。
一个GET函数检查If-Modified-Sinceheader,并与数据库的[进行比较=74=]项。
这是一个小代码示例:
if($hasModifications){
$response = [items]
$statusCode = 200;
} else {
$response = ['result'=>'no modifications'];
$statusCode = 304;
}
return $app->json($response,$statusCode,$headers);
每当 $statuscode!=200,我只会收到一个空白页面,也不会发送自定义 header。这也破坏了 CORS,因为我无法设置 Access-Control-Allow-Origin header.
我应该用其他方式吗?
(PS:这不是实际的代码,而且如果我将 $statusCode 替换为 200,那么一切都会恢复正常)
更新: 到目前为止,根据我一直在阅读的内容,我猜想 304 状态不应该在响应 body 上发送任何内容。但是 headers 呢?如果我不遵守 CORS,那么 AngularJS 前端将失败,我将无法捕获 "Not Modified" 异常!。 显然,我可以通过其他方式解决。但是,如果我能让这两件事都正常工作(REST+CORS)就好了!
更新二:
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);
如果我将 200 更改为 304,我看不到 var_dump 的输出(给我一个空的页)。另外,如果我在没有 header 参数的情况下设置 304 状态,它仍然是一样的。 似乎 return 或 $app->json 清除了 HeaderBag,因为我使用的是 JDesrosiers\Silex\Provider\CorsServiceProvider(),那些 headers 参数也被清除。
这是从 Firefox 获取的原始 HTTP 响应,状态代码为 304:
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)
还有这个,状态码 200:
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
Apache 在 304 状态代码上去除了 CORS headers。
您可以在问题 #51223 中阅读更多内容,您还可以找到解决此问题的补丁。
如果您不想或不能重新编译 Apache,您可以尝试 运行 Nginx,它将保留 CORS headers。