Я двигался весело вместе с моим сайтом до этой недели, когда мы начали видеть некоторые ошибки, которые оказались связаны с моим непониманием того, как работает Cake's RequestHandler, но мне еще предстоит найти подходящее обходное решение.
Я использую один метод для поиска и возврата контента в разных форматах, так что все они живут по одному URL (возможно, это моя ошибка, и мне нужно разделить их). Итак, в моем контроллере у меня есть:
if ($this->RequestHandler->ext == 'rss') {
чтобы забрать RSS-каналы. Я также попытался использовать isRss()
но изменил его, полагая, что это стало isRss()
моей проблемы. Моя проблема заключается в следующем:
При ударе этого URL-адреса (назовем его /blog
) из браузера, я обычно получаю HTML-ответ. Если я попал в /blog.rss
я получаю ответ от RSS. Отлично. Но если я попал в адрес /blog
с моим заголовком, как Accepts: application/rss+xml;
он будет возвращать RSS независимо от того, что не существует литерала .rss-расширения. Эти страницы кэшируются, поэтому теперь мои пользователи браузера просматривают кешированную версию RSS-канала при запросе адреса /blog
вместо HTML-версии.
Я проверил RequestHandler и выяснил, что он использует _setExtension () для установки значения ext
на основе заголовка Accepts, даже если не существует «реального» расширения. Кажется, для этого нет переопределения, поэтому похоже, что я либо вынужден самостоятельно анализировать URL-адрес, чтобы увидеть, действительно ли есть расширение, либо полностью отделить эти URL-адреса и не разрешить rss / json из адресного пространства /blog
(например, /blog/feed
, /blog/json
).
Есть ли лучший / более простой способ обойти это или что-то, что мне не хватает, так как это настроено? Я полагал, что ext
был надежным показателем того, что существует фактическое расширение, но, возможно, есть еще один способ его поиска?