2012-01-17 9 views
1

サイトの特定のセクションにhttpまたはhttpsでアクセスさせるためのスクリプトを作成しました。私たちは、ユーザーが通常のhttpページにリダイレクトされることを願っています。これまでのところ、とても良いですが、私はあなたのために2つの質問があります。http/httpsを強制する:リダイレクト時にhttpsとどのステータスヘッダーを送信するかを検出するにはどうすればよいですか?

  1. スイッチングプロトコルで正しいステータスヘッダーとは何ですか?私は現在、リダイレクトする前に、両方のケースで、これを使用しています:

    header('HTTP/1.1 301 Moved Permanently'); 
    
  2. 我々は、HTTPSを使用しているかどうかを検出するための好ましい方法は何ですか?

    // if ($_SERVER['SERVER_PORT'] == 443) /* EDIT: OK, not this? */ 
    
    if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on')) 
    

    他に何か?どちらも?コメントへの

回答:

  • 我々は、Apacheを使用しているが、普遍的な解決策があるかどうそれは素晴らしいだろう。

  • .htaccessを使用したくないのは、使用しているCMSによってhttpsに必要なページが「フラグが立てられている」ことと、これが一部であるためです。 URLをファイルに「ハードコードする」必要はありません。

+0

IIRCでは、 '$ _SERVER ['HTTPS']'は一部のサーバ(つまりApache)にのみ存在します。 – ceejayoz

+2

ポートの検査は信頼できません。 443以外のポートでSSLを実行することも可能ですが、HTTPSを使用しないでポート443 *に接続することもできます(ただし、通常はサーバーがエラーでリクエストを強制終了します)。 – animuson

+0

なぜ私はhtaccessのにおいがしませんか? –

答えて

2
  1. 301リダイレクトは、適切な方法です。 HTTPとHTTPSの中間ストリームを切り替えることはできません。ページをクライアントに再ロードする必要があります。
  2. $_SERVER['HTTPS']による2番目の方法が好ましい方法です。 Webサーバーがそれをサポートしていることを確認してください。
+0

「ブラウザにリロードする必要があります」とはどういう意味ですか? 'header( 'Location:...')でリダイレクトしています。私はちょうど '$ _SERVER ['HTTP_HTTPS']'というApacheで別の方法があるかもしれないことをhttp://stackoverflow.com/questions/452375/detecting-https-requests-in-phpで見ました。両方の/どちらかを調べるべきですか?私は '$ _SERVER ['SERVER_PORT']'値を完全に無視すべきですか?私が聞く限り、それは信頼できませんが、それは役に立たないのですか? –

+0

さて、もしブラウザではないなら、少なくともクライアント。要求は、適切なプロトコル(HTTPS対HTTP)を使用してクライアントによって行われなければなりません。 301リダイレクトはこれを強制します。クライアントに同じリクエストで切り替えられるように送ることはできません。はい、一部のApacheサーバーのバージョンにはHTTP_HTTPSが代わりにあります。あなたのバージョンのドキュメントをチェックしてください。 –

+0

ええ、それは新しいリクエストです。すべての '$ _POST'データとそれ以外のものは失われます。それはあなたが意味することですか?私は、HTTP_HTTPSとHTTPSの両方をチェックしてどちらかが「オン」かどうかを確認することに害はないと思いますか? –

関連する問題