142

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 経由でアクセスするのを止めることはできません...

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

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

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

4

22 に答える 22

181

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

if($_SERVER["HTTPS"] != "オン")
{
    header("場所: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    出口();
}
于 2008-09-17T17:56:15.730 に答える
47

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

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

必要に応じて、正規表現を使用して、時間の経過とともに Location をよりスマートにすることができます。

于 2008-09-17T17:53:37.530 に答える
43

クライアントが常に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 ヘッダーを設定します。

于 2012-08-27T15:53:12.610 に答える
19

.htaccess ファイルを作成して追加しました:

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

単純 !

于 2015-06-23T10:37:31.957 に答える
9
// 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);
}
于 2010-12-23T15:47:01.897 に答える
8

ロードバランサーの背後で実行する場合、このようなことをしなければなりませんでした。帽子のヒント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;
    }
}
于 2014-12-18T21:56:42.747 に答える
5

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 を強制する必要があるフォルダーに配置する必要があります。

于 2012-12-28T15:46:31.103 に答える
5

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

エサとして使わないと。

$_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 (同じセッションの異なる値)

したがって、私が言っているのは、答えが組み合わせにある場合、どちらか一方に落ち着かないということだけです。http://httpd.apache.org/docs/2.0/misc/rewriteguide.htmlいくつかのスタックはこちら -> Force SSL/https using .htaccess and mod_rewrite

and Getting the full URL of the現在のページ (PHP) にいくつか名前を付けます。




于 2015-06-04T22:19:51.053 に答える
3

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

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

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

于 2008-09-17T17:54:29.710 に答える
1

同じページに HTTP と HTTPS を混在させないでください。HTTP 経由で提供されるフォーム ページがある場合、データの送信に神経質になります。送信が HTTPS 経由なのか HTTP 経由なのかは、ソースの表示を行って検索しないとわかりません。

送信リンクとともに HTTPS を介してフォームを提供することは、アドバンテージにとってそれほど大きな変更ではありません。

于 2008-09-17T17:57:36.850 に答える
1
if(location.protocol!=='https:'){location.replace(`https:${location.href.substring(location.protocol.length)}`);}
于 2021-06-27T11:07:17.810 に答える
0

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

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

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

FORM POST (no get) のみを使用して有料ページにリダイレクトする必要があり、POST を使用しないページへのアクセスは他のページにリダイレクトする必要があります。(これにより、ホットジャンプしている人を捕まえることができます。)

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

開始するのに適した場所です。これ以上提供しないことをお詫びします。しかし、SSL を介してすべてを押し込む必要があります。

過保護ですが、少なくとも心配は減ります。

于 2008-09-17T17:58:15.600 に答える
-1

このスクリプトを使用しましたが、サイト全体でうまく機能します。

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    enter code hereheader('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}
于 2016-07-26T00:11:31.283 に答える