PHPを使用したHTTPからHTTPSへのリダイレクト


107

私はショッピングカートのWebサイトで作業していますが、ユーザーが請求の詳細を入力するときにHTTPSページにリダイレクトし、ログアウトするまで次のページのHTTPS接続を維持したいと考えています。

これを行うには、サーバー(Apacheを使用しています)に何をインストールする必要がありますか。また、このリダイレクトはPHPからどのように実行できますか?

回答:


247

次のようなものを試してください(ApacheおよびIISで機能するはずです)。

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}

5
常に機能するとは限りません。私はそれを使ってみましたが、$ _ SERVER配列に 'https'要素がありませんでした。これにより、 'リダイレクトが多すぎます'のエラーが発生しました。他の方法を使用する必要があります。
Usman Zaheer

5
if( $_SERVER['HTTPS'] == "off")このコードを機能させるには、テストする必要がありました。それは私がIISを使っているからだと思います。OPのようなApacheではありません。
Nick Pickering

1
@NicholasPickering Jepp、$ _ SERVER変数はWebサーバーによって異なる場合があります。
Raphael Michel

6
注:die()またはexit()は、ページの残りの部分が実行されないように(そして場合によってはクライアントに追加情報を送信できないように)(つまり、ヘッダーを尊重しないハッカーまたはブラウザに)、ヘッダーリダイレクトの後に置くことが重要な場合があります。
dajon

3
サーバー環境/セットアップによっては、$ _ SERVER ['HTTP_X_FORWARDED_PROTO']を使用してhttp / httpsを確認する必要がある場合があります
David Meister

19

これは良い方法です:

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>

1
良好とマークされたものは、少なくともChromeでは何度もリダイレクトを返します
Thomas J Younsi

!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'最後の部分がtrueの場合、最初の部分はfalseになるため、条件は常にfalseになります。
最大

@Max:私はあなたの言うことを理解していません。2番目の条件が真($ _SERVER ['HTTPS'] == 'on')の場合、最初の条件もTRUEにする必要があります(もちろん、値が含まれているため、サーバー変数が設定されています!)
OMA

7

IIS上のPHPを使用したHTTPからHTTPSへのリダイレクト

MSインターネットインフォメーションサービス(IIS)のバージョン6を実行するWindowsサーバーでHTTPSへのリダイレクトを取得するのに問題がありました。LinuxホストでApacheを使用することに慣れているので、助けを求めてインターネットに目を向けました。これは、「php redirect http to https」を検索したときの最高ランクのStack Overflowの質問でした。しかし、選択した答えは私にはうまくいきませんでした。

試行錯誤の末、IISでは$_SERVER['HTTPS']off非TLS接続用に設定されていることがわかりました。次のコードは、検索エンジンを介してこの質問に来る他のIISユーザーを助けるはずだと思いました。

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

編集:別のスタックオーバーフローの回答から、より簡単な解決策はチェックすることif($_SERVER["HTTPS"] != "on")です。


13
@JakeSylvestre公正です。この質問にのタグが付けられていないapacheため、このページに検索エンジンを介してアクセスする可能性がある他のIISユーザー(私がいた状況と同様)のためにこの回答を投稿しました。私は、回答はOPだけでなくコミュニティ全体の利益のためであるという見解に同意します。
Anthony Geoghegan

6

いつでも使用できます

header('Location: https://www.domain.com/cart_save/');

保存URLにリダイレクトします。

しかし、私は.htaccessとApacheの書き換えルールでそれを行うことをお勧めします。


13
リダイレクトする前に、常に$ _SERVER ['HTTPS']を確認することをお勧めします。
Raphael Michel

$ _SERVER ['HTTPS']は常に設定されるとは限りませんが、事前に確認することをお勧めします。そのため、Apacheの便利な書き換えルールを使用して、HTTPS上にない場合にのみリダイレクトすることをお勧めします。
powtac、2011

Apacheは追加の.htaccessファイルを使用することをお勧めしますが(速度が低下するため)、Apacheの* .conf内の書き換えルールを使用することをお勧めします。
powtac 2013年

1

私のAWS beanstalkサーバーで、$ _ SERVER ['HTTPS']変数が表示されません。$ _SERVER ['HTTP_X_FORWARDED_PROTO']は 'http'または 'https'のいずれかになる可能性があるため、AWSでホストしている場合は、次のように使用します。

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.