1

Cake の RequestHandler の動作方法に関する私の誤解に関連していることが判明した今週まで、いくつかのエラーが発生し始めましたが、まだ適切な回避策を見つけていません。

1 つの方法を使用して、さまざまな形式のコンテンツを検索して返すため、それらはすべて同じ URL に存在します (おそらくこれは私のエラーであり、それらを分割する必要がありますか?)。したがって、私のコントローラーには次のものがあります。

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

RSS フィードでピックアップします。私も使ってみisRss()ましたが、それが私の問題の原因であると考えて変更しました。私の問題はこれです:

ブラウザからこの URL ( と呼びましょう/blog) にアクセスすると、通常は HTML 応答が返されます。ヒットすると/blog.rss、RSS レスポンスが返ってきます。これまでのところ素晴らしい。しかし、リテラル .rss 拡張子がないという事実に関係なく、RSS を返すため/blog、ヘッダーを設定してアドレスをヒットすると。Accepts: application/rss+xml;これらのページはキャッシュされているため、ブラウザー ユーザーが/blogアドレスを要求すると、HTML バージョンではなく、キャッシュされたバージョンの RSS フィードが表示されるようになりました。

extRequestHandler にチェックインしたところ、「実際の」拡張機能が存在しない場合でも、Accepts ヘッダーに基づいて値を設定するために _setExtension() が使用されていることがわかりました。これにはオーバーライドがないように見えるので、URL を自分で解析して本当に拡張子があるかどうかを確認するか、これらの URL を完全に分離して、/blogアドレス空間から rss/json を許可しないようにする必要があるようです (例: 、/blog/feed/blog/json)。

これを回避するためのより良い/より簡単な方法、またはこれが設定されている方法で欠けているものはありますか? 私はext、実際の拡張機能があることの信頼できる兆候であると考えていましたが、それを探す別の方法があるのでしょうか?

4

1 に答える 1

2

あなたは部分的に正しいです。拡張子が明示的に設定されていない_setExtension場合に関数が呼び出されるため、のような URLはその関数を要求しますが、そうすると、呼び出されません。/blog/blog.rss_setExtension

とにかく、それはその点を明確にするためでした。先に進みます。

_setExtension() ドキュメントを読む

html が優先タイプの 1 つである場合、コンテンツ タイプは設定されません。これは、html および他のいくつかのコンテンツ タイプを優先するブラウザでの問題を回避するためです。

したがって、ここで私が理解しているのは、に渡すhtmlRouter::parseExtensions、受け入れられたヘッダーに従ってコンテンツタイプが設定されないということです。お使いのバージョンの Cakeのコード(149 行目) を確認するifと、拡張機能のコンテンツ タイプのオーバーライドをスキップするオプションがありhtmlますxhtml

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

やってみる

Router::parseExtensions('html', 'rss' /*and other extensions if you want*/)

問題が解決するかどうかを確認してください。

于 2013-04-17T19:48:09.460 に答える