web-dev-qa-db-ja.com

CakePHPが要求されていない301リダイレクトを生成するのはなぜですか?

一見ランダムにWebページ(/ wantなど)にアクセスしようとすると、同じサブドメインの別のWebページ(/ getなど)が応答でロードされます。これは、私が開発している一連のWebサイトで、localhostバージョンと実稼働バージョンの両方で長年にわたって行われてきました。私はそれを奇妙なFirefoxのフロックとして無視しようとしましたが、別のユーザーのコンピューターで同じことが起こっていることを発見したので、何が起こってもこれらのWebサイトが一部の人々にとって使用不能になるのではないかと心配しています。

  • キャッシュの問題:これは、Firefoxのキャッシュを手動でクリアするまで続きます。
  • URLの変更:/ wantと入力しても、アドレスバーのURLは/ getになります。
  • リダイレクトコードなし:をリダイレクトするフロントエンドまたはバックエンドコードにnothingがありますユーザー。
  • Content irrelevant:/ wantが空白ページに変更された場合でも、/ wantのコンテンツが変更されてもエラーは継続します。/getのコンテンツが変更されると、それらの変更が表示されるため、ロードされているページの静的なスナップショットではありません。
  • Firefoxのみ:他のブラウザではこれに気付かず、ChromeとFirefoxの両方が/ wantをロードしようとした場合同時に、Firefoxのみが/ getをロードします。現在Firefox 29.0.1を使用していますが、これは最近のいくつかのバージョンでも発生しています。
  • 見分けがつかないパターン:これがどの2つのページで発生するかは一貫していませんが、常に頻繁にロードして直接移動するページのようです。
  • CakePHPの使用:影響を受けるWebサイトはすべて、CakePHP 2.4.5の同じインストールの異なるサブディレクトリで実行されます。

私は、何が起こっているのか、この出来事の説明を他の誰かに手がかりを探すためにインターネットを探し回っていましたが、空っぽになりました。問題の根本原因を特定するためにこれをテストする方法や、CakePHPサイトのコード内の何かが原因である可能性を排除する方法もわかりません。

テスト後に更新:

ネットワークスニファーは、/ wantをロードしようとすると、/ getの実行要求のみが行われることを確認します。ただし、Firebugで/ wantのAJAXリクエストを実行すると、次のように表示されます。

GET http://example.com/want 301 Moved Permanently  
Response Headers: Location: http://example.com/get

GET http://example.com/get

そのため、Firefoxは301リダイレクトをキャッシュしましたが、現在または過去にステータスを301に設定したWebサイトのコードには何もありません。Firefoxはランダムに決定しているようです301リダイレクトをキャッシュします。また、一貫性がありません。これらのリダイレクトは、Webサイトが変更されたりFirefoxのキャッシュがクリアされたりすることなく、独自に変更される場合があるためです。

みんな、私と同レベル。 Firefoxは真っ直ぐにお化けですよね?

質問に答える:

Firefoxのキャッシュをクリアした後、おそらくある時点で再び発生するのでしょうか?
はい。

同じ/ want URL?または常に異なる/新しいURLですか?
同じ場合もあれば異なる場合もあります。

/ wantと/ getはおそらく関係ありませんか?
同じWebサイトの2つのページまで。

通常のリンクとは異なり、リダイレクトでナビゲートしていませんか?
いいえ、通常のリンクだけで、/ want URLをアドレスバーに貼り付けます。ユーザーを/ getにリダイレクトするサイト内の唯一のものは、/ wantにさえありません。

成功時にリダイレクトする任意のログインページ
ハァッ。さて、CakePHPはこれらのステップを通してユーザーを送ります...

  1. ログインセッションの有効期限が切れる
  2. 制限されたページにアクセスしてみてください
  3. ログインページにリダイレクトされます
  4. ログインに成功したら、制限されたページにリダイレクトします

デフォルトでは、CakePHPは コード302(一時的に検出/移動) でリダイレクトを行いますが、キャッシュすべきではありません。
ただし、、影響を受けるすべてのサイトは milesjのCakePHP Utilityプラグイン のAutoLoginコンポーネントを使用していると確信しています。 自動ログインが成功すると、301の永続的なリダイレクトが含まれます 。その行では、ユーザーは次の順序でこれらの非ヌルのいずれかに301リダイレクトされます。

  1. ヘッダーによって決定される参照ページ
  2. または、セッションデータによって決定される参照ページ
  3. または、開発者が指定するデフォルトの「ログイン後にここにリダイレクト」ページへ
  4. または、サイトのルートページ(/)

「ログイン後にここにリダイレクトする」ページを指定したことがないため、すべてが自動化され、ユーザーがログインしようとしたページまたはログイン後に/に移動する必要があります。 AutoLoginコンポーネントからこの/ want->/get動作が発生することを想像できる唯一の方法は、どういうわけか...

  1. ユーザーはヘッダーにリファラーデータを送信しない方法で/ wantをロードしようとします(たとえば、Firefoxが閉じられ、同じタブが再度ロードされるか、URLが手動で入力されます)
  2. 「/ get」はセッションデータにリファラーとして残留します(たとえば、最新のリファラー)
  3. AutoLoginコンポーネントは、セッションの期限切れを通知し、Cookieデータを介してユーザーにログインします
  4. ログインに成功すると、AutoLoginコンポーネントはセッション内にあるため、/ getへの永続的な301リダイレクトを実行します。
  5. Firefoxは、/ wantから/ getへのリダイレクトを永続的にキャッシュします

しかし、CakePHPコードベースを探していると、セッション内のリファラーデータを管理する方法や、あるリクエストが別のリクエストからリファラーを継承することが実際に可能かどうかを頭でラップすることができません。このシナリオは可能だと思われます。

AutoLoginコンポーネントのGitHubページの問題 を作成したので、私よりも賢い人が私の疑いを評価するのを手伝うことができます。

2
Phantom Watson

この問題は、 milesjのCakePHP Utilityプラグイン修正済み の問題(1つのミスタイプされた文字)が原因であったようです。

2
Phantom Watson