web-dev-qa-db-ja.com

ユーザーにHTTPではなくHTTPS経由でページにアクセスさせるにはどうすればよいですか?

HTTPSページ(Apache上のPHP)として強制的にアクセスさせたいページが1つだけあります。ディレクトリ全体にHTTPSを要求せずにこれを行うにはどうすればよいですか?または、HTTPページからHTTPSページにフォームを送信する場合、HTTPではなくHTTPSでフォームを送信しますか?

これが私の例です:

http://www.example.com/some-page.php

私はそれを通してのみアクセスしたいです:

https://www.example.com/some-page.php

確かに、このページへのすべてのリンクをHTTPSバージョンに向けることができますが、だからといって、意図的にHTTPを介してアクセスするのを止めることはできません...

HTTPSバージョンにアクセスしていることを確認するために、PHPファイルのヘッダーにリダイレクトを配置することを考えました。

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
  header('Location: https://www.example.com/some-page.php');
}

しかし、それは正しい方法ではありえませんか?

ところで、URLに注意を払ってはいけません。実際にショッピングカートなどがあるページである場合、別の方法で行うことを知っています。これは、1つの商品を1つの価格で販売するサイトからのページと考えてください。クレジットカード情報を入力すると、一度だけカードに課金するという明確な目的で外部サイトの支払いゲートウェイに送信されます。

130
Wiki

私が以前にやった方法は、基本的にあなたが書いたようなものですが、ハードコードされた値はありません:

if($ _ SERVER ["HTTPS"]!= "on")
 {
 header( "Location:https://"。$ _SERVER ["HTTP_Host"]。$ _SERVER ["REQUEST_URI "]);
    出口();
}
168
Adam Rosenfield

Apacheでディレクティブとmod_rewriteを使用して実行できます。

<Location /buyCrap.php>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
</Location>

必要に応じて、 正規表現 を使用して、場所をよりスマートにできます。

45
thebigjc

clientに、常に HTTP Strict Transport Security (HSTS)ヘッダーでHTTPSを要求するように強制する必要があります。

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;

// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

HSTSはほとんどの最新ブラウザでサポートされていますが、ユニバーサルではないことに注意してください。したがって、上記のロジックは、HTTPで終了する場合、サポートに関係なくユーザーを手動でリダイレクトし、その後、可能であればブラウザーによってさらにクライアント要求がリダイレクトされるようにHSTSヘッダーを設定します。

36
Jacob Swartwood

私はちょうど.htaccessファイルを作成し、追加しました:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

シンプル!

15
MatHatrik
// Force HTTPS for security
if($_SERVER["HTTPS"] != "on") {
    $pageURL = "Location: https://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    header($pageURL);
}
9
Jeff

ロードバランサーの背後で実行する場合、このようなことをしなければなりませんでした。帽子のヒント https://stackoverflow.com/a/16076965/766172

function isSecure() {
    return (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
     || $_SERVER['SERVER_PORT'] == 443
     || (
            (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL'])   && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        )
    );
}

function requireHTTPS() {
    if (!isSecure()) {
        header('Location: https://' . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'], TRUE, 301);
        exit;
    }
}
7
syvex

http://www.besthostratings.com/articles/force-ssl-htaccess.html

ユーザーがセキュリティで保護された接続でサイトを閲覧していることを確認する必要がある場合があります。ユーザーを常に安全な接続(https://)にリダイレクトする簡単な方法は、次の行を含む.htaccessファイルを使用して実現できます。

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

.htaccessはWebサイトのメインフォルダーに配置する必要があることに注意してください。

特定のフォルダーにHTTPSを強制する場合は、次を使用できます。

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

.htaccessファイルは、HTTPSを強制する必要があるフォルダーに配置する必要があります。

5
itsazzad

わかりました。今、これに関するものがたくさんありますが、誰も「安全」な質問を本当に完成させません。私にとっては、安全でないものを使用するのはばかげています。

餌として使用しない限り。

$ _SERVERの伝播は、方法を知っている人の意志で変更できます。

また、Sazzad Tushar Khanとthebigjcが述べたように、これを行うためにhttaccessを使用することもでき、それを含む多くの回答があります。

追加するだけです:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

.httaccessにあるものの最後までです。

それでも、これら2つのツールを使用した場合ほど安全ではありません。

残りは簡単です。不足している属性がある場合...

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY
}

if(strstr($_SERVER['HTTP_Host'],"mywebsite.com") === FALSE){// Something is FISHY
}


また、httaccessファイルを更新したことを確認して、次のことを確認します。

if($_SERVER["HTTPS"] !== "on"){// Something is fishy
}

確認できる変数は他にもたくさんあります。

Host_URI(チェックする静的属性がある場合)

HTTP_USER_AGENT(同じセッションの異なる値)

だから、答えが組み合わせにあるとき、私が言っていることはただ単にどちらか一方に決着するだけではありません。

httaccessの書き換え情報の詳細については、docs-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html を参照してください。

ここにいくつかのスタック-> 。htaccessとmod_rewriteを使用してSSL/httpsを強制する
そして
現在のページの完全なURLを取得する(PHP)
カップルに名前を付けます。

5
JSG

PHP方法:

$is_https=false;
if (isset($_SERVER['HTTPS'])) $is_https=$_SERVER['HTTPS'];
if ($is_https !== "on")
{
    header("Location: https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI']);
    exit(1);
}

Apache mod_rewriteの方法:

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
4
Jay

$_SERVER['HTTPS']を使用して SSL であるかどうかを確認し、そうでない場合は適切な場所にリダイレクトします。

また、フォームを表示するページはHTTPS経由でフィードする必要はありません。最も必要なのはポストバックURLです。

Edit:はい、以下に指摘するように、プロセス全体をHTTPSで処理するのが最善です。それははるかに安心です-私は投稿が最も重要な部分であることを指摘していました。また、すべてのCookieは安全に設定されているため、SSL経由でのみ送信されることに注意する必要があります。 mod_rewriteソリューションも非常に気の利いたもので、自分のWebサイトで多くのアプリケーションを保護するために使用しました。

3
DGM

htaccessを使用:

#if domain has www. and not https://
  RewriteCond %{HTTPS} =off [NC]
  RewriteCond %{HTTP_Host} ^(?i:www+\.+[^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [QSA,L,R=307]

#if domain has not www.
  RewriteCond %{HTTP_Host} ^([^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://www.%{HTTP_Host}%{REQUEST_URI} [QSA,L,R=307]
3
siavash bagheri

Apache、または.htaccessファイルをサポートするLiteSpeedのようなものを使用する場合、次の操作を実行できます。 .htaccessファイルがまだない場合は、ルートディレクトリ(通常はindex.phpが存在する場所)に新しい.htaccessファイルを作成する必要があります。次に、これらの行を.htaccessの最初の書き換えルールとして追加します。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

すべての書き換えルールについて、.htaccessで「RewriteEngine On」という命令を1回だけ必要とするので、すでに持っている場合は、2行目と3行目をコピーしてください。

これがお役に立てば幸いです。

1
Antonio

これを使用するだけでは不十分です。

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
    exit();
}

Httpコンテンツ(外部http画像ソースなど)がある場合、ブラウザは潜在的な脅威を検出します。したがって、コード内のすべてのrefとsrcがhttpsであることを確認してください

1

IISを使用している場合、web.configにこの行を追加すると役立ちます。

<httpProtocol>
    <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000"/>
    </customHeaders>
</httpProtocol>
<rewrite>
    <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                 <add input="{HTTPS}" pattern="off" ignoreCase="true" />
              </conditions>
              <action type="Redirect" redirectType="Found" url="https://{HTTP_Host}/{R:1}" />
         </rule>
    </rules>
</rewrite>

完全なサンプルファイル

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000"/>
             </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                      <match url="(.*)" />
                      <conditions>
                         <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                      </conditions>
                      <action type="Redirect" redirectType="Found" url="https://{HTTP_Host}/{R:1}" />
                 </rule>
            </rules>
       </rewrite>
   </system.webServer>
</configuration>
1
Tschallacka

同じページでHTTPとHTTPSを混在させないでください。 HTTP経由で提供されるフォームページがある場合、データを送信することに神経質になります-View Sourceを実行せずに送信するのがHTTPSまたはHTTPであるかどうかはわかりません。

フォームを送信リンクと共にHTTPS経由で提供することは、利点のためにそれほど大きな変更ではありません。

1
JBB

私は$ _ SERVER [HTTPS]のステータスをチェックする多くのソリューションを試してきましたが、オン、オフなどに設定または設定されないことがあるため、信頼できないようですスクリプトの内部ループリダイレクトを引き起こします。

サーバーが$ _ SERVER [SCRIPT_URI]をサポートしている場合、これが最も信頼できるソリューションです。

if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) {
    header("location:https://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]");
    echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]'>";
    exit;
}

インストールによっては、サーバーが$ _SERVER [SCRIPT_URI]をサポートしない場合がありますが、サポートしている場合は、これが使用するのに適したスクリプトであることに注意してください。

ここで確認できます。 一部のPHPインストールには$ _SERVER ['SCRIPT_URI']があり、他のインストールにはない場合

0
Tarik

セキュリティ上の理由ですべきではありません。特にクッキーがここで使用されている場合。これにより、Cookieベースのリプレイ攻撃にさらされやすくなります。

いずれにしても、Apache制御ルールを使用して調整する必要があります。

次に、HTTPSが有効になっているかどうかをテストし、必要に応じて必要に応じてリダイレクトできます。

FORM POST(getなし)のみを使用して有料ページにリダイレクトする必要があり、POSTのないページへのアクセスは他のページにリダイレクトされる必要があります。 (これにより、人々はただホットジャンピングをキャッチします。)

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

始めるのに適した場所です。これ以上提供しないことをおaびします。しかし、あなたは本当にshouldSSLを介してすべてを突き出す必要があります。

それは過度に保護的ですが、少なくとも心配は少ないです。

0
Kent Fredric

多分これは助けてくれるかもしれません、あなたはそれが私のウェブサイトのためにした方法です、それは魅力のように機能します:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
    exit();
}
0