私はPlay! 3つの展開を持つフレームワークHerokuプロジェクト。 1つは私の開発マシン、1つはHerokuのベータ版、もう1つはHeroku版です。次のように彼らのHTTPとHTTPSのURLは以下のとおりです。Https再生フレームワークでHerokuのリダイレクトとログインクッキー
DEV BETA PRODUCTION
HTTP URL | http://localhost:9000 http://domain-beta.herokuapps.com http://www.domain.com
HTTPS URL | https://localhost:9443 https://domain-beta.herokuapps.com https://secure.domain.com
HTTPS Type | My cert Piggyback (using Heroku's cert) Hostname-based SSL (using my cert)
私もHTTPSを必要とするため、バックHTTPにリダイレクトするための方法(助けをthis postへの感謝を)持っているクラスHttpsRequired
を持っています。
public class HttpsRequired extends Controller {
/** Called before every request to ensure that HTTPS is used. */
@Before
public static void redirectToHttps() {
//if it's not secure, but Heroku has already done the SSL processing then it might actually be secure after all
if (!request.secure && request.headers.get("x-forwarded-proto") != null) {
request.secure = request.headers.get("x-forwarded-proto").values.contains("https");
}
//redirect if it's not secure
if (!request.secure) {
String url = redirectHostHttps() + request.url;
System.out.println("Redirecting to secure: " + url);
redirect(url);
}
}
/** Renames the host to be https://, handles both Heroku and local testing. */
@Util
public static String redirectHostHttps() {
if (Play.id.equals("dev")) {
String[] pieces = request.host.split(":");
String httpsPort = (String) Play.configuration.get("https.port");
return "https://" + pieces[0] + ":" + httpsPort;
} else {
if (request.host.endsWith("domain.com")) {
return "https://secure.domain.com";
} else {
return "https://" + request.host;
}
}
}
/** Renames the host to be https://, handles both Heroku and local testing. */
@Util
public static String redirectHostNotHttps() {
if (Play.id.equals("dev")) {
String[] pieces = request.host.split(":");
String httpPort = (String) Play.configuration.get("http.port");
return "http://" + pieces[0] + ":" + httpPort;
} else {
if (request.host.endsWith("domain.com")) {
return "http://www.domain.com";
} else {
return "http://" + request.host;
}
}
}
}
私はそれが実行される前に、すべてのパスワードが暗号化された提出されることを保証するために、HttpsRequired.redirectToHttps()
を呼び出すためにSecure.login()
を修正。その後、私のSecurity.onAuthenticated()
では、私は標準HTTP上のホームページにリダイレクトします。
これは開発者とベータ版のデプロイメントには効果的ですが、本番環境ではすべてのHTTPリクエストがHTTPSログインページにリダイレクトされます。 HTTPSでサイト全体を使用することはできますが、通常のHTTPも使用したいと思っています。
私のすべてのページは、メンバー専用として保護されており、ユーザーは@With(Secure.class)
アノテーションを使用してログインする必要があります。私はそれがwww.domain.com
の代わりにsecure.domain.com
で起こるという事実に関連していなければならないと思っています。
secure.domain.com
で作成したログインCookieを変更してwww.domain.com
で動作させる方法はありますか?
うーん。これは、ログインクッキーのための私の問題を修正しましたが、今、私は、HerokuのHTTPS上で動作していないvalidation.keep()の新しい問題を抱えています。新しい質問[ここ](http://stackoverflow.com/questions/9166129/play-framework-on-heroku-validation-keep-isnt-working-over-https)を作成しました。 –