我一直在愉快地和我的网站一起移动,直到本周我们开始看到一些错误突然出现,这与我对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
是一个可靠的迹象表明存在实际的延伸,但也许还有另一种方法来寻找它?
答案 0 :(得分:2)
你是对的。如果没有明确设置扩展名,则会调用_setExtension
函数,因此像/blog
这样的网址会请求该功能,但如果您执行/blog.rss
,{{ 1}}不会被调用。
无论如何,这只是为了明确这一点。继续前进。
如果html是首选类型之一,则不会设置任何内容类型, 这是为了避免浏览器喜欢html和几个问题 其他内容类型。
所以,我在此理解的是:如果您将_setExtension
传递给html
,则不会根据接受的标头设置内容类型。检查the code(第149行)您的蛋糕版本,如果您有Router::parseExtensions
或if
,则html
会跳过扩展程序的内容类型覆盖你喜欢的类型。
xhtml
尝试并执行
if (count($similarTypes) === 1 && !in_array('xhtml', $preferredTypes) && !in_array('html', $preferredTypes)) {
$this->ext = array_shift($similarTypes);
}
并查看是否能解决您的问题。