回答:
次のようなものを試してください(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;
}
if( $_SERVER['HTTPS'] == "off")
このコードを機能させるには、テストする必要がありました。それは私がIISを使っているからだと思います。OPのようなApacheではありません。
これは良い方法です:
<?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();
}
?>
!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'
最後の部分がtrueの場合、最初の部分はfalseになるため、条件は常にfalseになります。
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")
です。
apache
ため、このページに検索エンジンを介してアクセスする可能性がある他のIISユーザー(私がいた状況と同様)のためにこの回答を投稿しました。私は、回答はOPだけでなくコミュニティ全体の利益のためであるという見解に同意します。
いつでも使用できます
header('Location: https://www.domain.com/cart_save/');
保存URLにリダイレクトします。
しかし、私は.htaccessとApacheの書き換えルールでそれを行うことをお勧めします。
私の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;
}