web-dev-qa-db-ja.com

302リダイレクトはリファラー文字列を維持しますか?

ユーザーをあるページから別のページにリダイレクトする必要がありますが、元のリファラー文字列を維持する必要があります。たとえば、 http://www.othersite.com/pageA.jsp で開始する場合は、 http://www.mysite。 com/pageB.jsp 、それは http://www.mysite.com/pageC.jsp への302リダイレクトを実行し、「 http ://www.othersite.com/pageA.jsp "

これは302リダイレクトの通常の動作ですか?または、「 http://www.mysite.com/pageB.jsp 」を支持して、元のリファラーが削除されますか?それは望ましくありません。

違いがあるかどうかはわかりませんが、JSPで作業しており、response.sendRedirect()を使用して302リダイレクトを実行しています。

私はこれで実験を行ったことに言及する必要があり、元のリファラー文字列を保持しているようです( " http://www.othersite.com/pageA.jsp ")これが通常のデフォルトの動作であることを確認してください。

ご協力ありがとうございました。

追加するために編集:

現在302リダイレクトを使用していますが、おそらく301リダイレクトを代わりに使用できます。 301リダイレクトの動作がより信頼できるかどうかを知っていますか?

88
sangfroid

短い答えは、関連するRFC 2616で指定されていないことです http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36 Refererヘッダーまたは302ステータスコードのいずれか。

最善の策は、複数のブラウザーでテストを行い、コンセンサス行動があるかどうかを確認することです。

完全なベルトとブレースの場合、リダイレクトURLに元のリファラーをエンコードして、確実に取得できるようにします。

30
Malcolm Box

302については知りませんが、今日いくつかのブラウザーで301をテストしました。結果は以下のとおりです。

[〜#〜] scenario [〜#〜]:ユーザーがdomainAを指すdomainXのリンクをクリックします。 domainAは、domainBへの301リダイレクトを行います。

  • IE8 referer domainBにランディングする場合:domainX(InPrivateブラウズを使用する場合でも、ユーザーが新しいタブでリンクを開く場合でも)
  • Safari4 referer domainBへの着陸時:domainX(ユーザーが新しいタブでリンクを開いた場合でも)
  • FF3.6.10 referer domainBへの着陸時:domainX(ユーザーが新しいタブでリンクを開いた場合でも)
  • Chrome5 refererは、domainBにランディングする場合:domainX(nlessユーザーが新しいタブでリンクを開く)
  • Chrome26 referer domainBへの着陸時:domainX(ユーザーが新しいタブでリンクを開いた場合でも)
115
Marco Demaio

良い質問。この場合、リファラーの送信はブラウザーに完全に依存します(ブラウザーは新しいリソースに対して別の要求を行うように指示されるため)。

RFC 2616 この問題については沈黙しています:

要求されたリソースは、別のURIの下に一時的に存在します。リダイレクトはときどき変更される可能性があるため、クライアントは、今後のリクエストにRequest-URIを引き続き使用する必要があります。この応答は、Cache-ControlまたはExpiresヘッダーフィールドで示されている場合にのみキャッシュ可能です。

ブラウザが正しいリファラーを送信することを信用しません。他のものとは異なる何かを送信するものが少なくとも1つあるに違いない。

回避策

可能であれば、?override_referer=<old_url>パラメータをリダイレクト先のURLに追加し、HTTP_REFERERの代わりにその値を解析します。

そうすれば、常に正しい結果を得ることができ、セキュリティの面で何も失うことはありません。リファラーはどちらの方法でも偽装できます。

12
Pekka 웃

私は正反対の問題を抱えていました:私はリファラーが「pageB」であることを望みましたが、現在のブラウザはどれもこのように進みません...

そこで、301または302リダイレクトの代わりにpageBでHTMLリダイレクトを試しました。

<meta http-equiv="refresh" content="0; url=pageC.jsp" />

結果は驚くべきものでした:

  • リファラーはChromeでpageBです
  • リファラーは、FireFoxを使用したEMPTY&IE!

これが役立つことを願っています

5
fred727