CakePHP RequestHandler返回RSS / JSON而不是HTML

时间:2013-04-17 17:27:24

标签: php cakephp cakephp-2.1

我一直在愉快地和我的网站一起移动,直到本周我们开始看到一些错误突然出现,这与我对Cake的RequestHandler的工作方式的误解有关,但我还没有找到一个好的解决方法。

我正在使用一种方法来查找和返回各种格式的内容,以便它们都存在于同一个URL中(也许这是我的错误,我需要拆分它们?)。所以,在我的控制器中我有:

if ($this->RequestHandler->ext == 'rss') {

获取RSS源。我也尝试使用isRss()但改变了它,认为这是我问题的根源。我的问题是:

当从浏览器点击此网址(我们称之为/blog)时,我通常会收到HTML回复。如果我在/blog.rss点击它,我会收到RSS回复。到目前为止很棒。但是,如果我将/blog地址设置为Accepts: application/rss+xml;,它将返回RSS,而不管没有文字.rss扩展名。这些页面是缓存的,所以现在我的浏览器用户在请求/blog地址而不是HTML版本时最终会看到RSS源的缓存版本。

我检查了RequestHandler,结果发现它使用_setExtension()根据Accepts标头设置ext值,即使没有“真正的”扩展名存在。似乎没有覆盖这个,所以看起来我要么被迫自己解析URL以查看是否确实存在扩展或者完全分离这些URL而不允许来自{{1}的rss / json地址空间(例如,/blog/blog/feed)。

是否有一种更好/更简单的方法可以解决这个问题或者我设想的方式?我认为/blog/json是一个可靠的迹象表明存在实际的延伸,但也许还有另一种方法来寻找它?

1 个答案:

答案 0 :(得分:2)

你是对的。如果没有明确设置扩展名,则会调用_setExtension函数,因此像/blog这样的网址会请求该功能,但如果您执行/blog.rss,{{ 1}}不会被调用。

无论如何,这只是为了明确这一点。继续前进。

阅读_setExtension() docs

  

如果html是首选类型之一,则不会设置任何内容类型,   这是为了避免浏览器喜欢html和几个问题   其他内容类型。

所以,我在此理解的是:如果您将_setExtension传递给html,则不会根据接受的标头设置内容类型。检查the code(第149行)您的蛋糕版本,如果您有Router::parseExtensionsif,则html会跳过扩展程序的内容类型覆盖你喜欢的类型。

xhtml

尝试并执行

if (count($similarTypes) === 1 && !in_array('xhtml', $preferredTypes) && !in_array('html', $preferredTypes)) {
         $this->ext = array_shift($similarTypes);
     }

并查看是否能解决您的问题。