HTTPSをHTTPにどのようにリダイレクトしますか?


166

HTTPSをHTTPにどのようにリダイレクトしますか?つまり、誰もが(一見)教えていることの反対です。

私はSSL証明書を支払ったHTTPS上のサーバーと、私が支払っていないミラーを持っていますが、緊急事態のためだけに保持しているため、証明書を取得する価値がありません。

私のクライアントのデスクトップには、http://production_serverhttps://production_server(両方とも)を指すショートカットがいくつかあります。ただし、本番サーバーがダウンした場合、DNS転送が起動し、ショートカットに「https」が含まれるクライアントがhttps://mirror_server(機能しない)見つめられ、大きな太いInternet Explorer 7の不安感の赤い画面が表示されます。私の会社のために。

残念ながら、クライアントレベルでこれを切り替えることはできません。これらのユーザーは非常にコンピューターの知識がなく、HTTPSの「セキュリティの問題」エラー(特に、Firefox 3とInternet Explorer 7が現在処理している方法:ありがたいことに、ありがたいが、ここでは私を助けてくれないLOL)に驚かされる可能性が非常に高い。

http-> httpsリダイレクト用のApacheソリューションを見つけるのは非常に簡単です ですが、私の人生では、その逆はできません。

アイデア?


2
やめてください !HTTPからのHTTPSリダイレクトは非常に危険です(実際、悪用のためにすぐにすべてのブラウザによってブロックされます)。これがサイレントHTTPステータスを介したノードである場合(ただし、これがJavaScriptによって行われる場合は同じです) (1)一時的にHTTPSパーキングページがあり、ユーザーがアクティブにクリックしてリンクをたどるように促します。または: - (2)HTTPSリダイレクトにHTTP正確に同じドメインとリダイレクトが要求されたコンテンツタイプを変更しません。ブラウザで許可することで、多くのマルウェアが分離を通過できるようになりました。このようなリダイレクトは非常に偽りです。
verdy_p 2018年

4
これは内部サイトのように見えます。OPは何が起こっているのかをOPが知っているので危険ではありません...これがWeb向けサーバーである場合、私はあなたに同意しますが、内部のローカルのみのWebサーバー、リダイレクトこのファッションは問題ではありません。
2018年

@verdy_pキャプティブポータルの場合のように、HTTPSからHTTP 302へのリダイレクトに取り組んでいます。参照しているドキュメントを教えてもらえますか?
jprusakova

キャプティブポータルでは、これがまったく同じドメイン(サブドメインでさえも)へのものである場合を除いて、HTTPSからHTTP 302へのリダイレクトを実行しないでください。また、情報漏えいのリスクが高いため、リダイレクトで透過的に渡されるセッショントークンとCookieに注意してください。HTTPターゲットが微調整される可能性があり、マルウェア透過プロキシや悪意のあるDNSによってさえ情報が取得される可能性があることを知っておく必要があります。したがって、プライベートセッション/ cookies / requestsを含むHTTPSリンクでは、これを行わないでください。
verdy_p

このようなHTTPS 302リダイレクトは、常にHTTPSサイトのセキュリティホールです。大きなリスクは、セッションが盗まれ、認証されたユーザーがプライベートアカウントを取得することです。そして、すべての場合において、JavaScriptまたはアクティブなマルチメディアをロードするためにそのようなリダイレクトを行わないでください。これは、HTTPSの「サンドボックス」レルムへの門戸です。HTTPをHTTPS(特にメインポータルまたはプライベートデータ/セッション/ Cookieを必要としない静的なパブリックページ)にリダイレクトし、それ以外の場合はHTTPSを使用することを検討してください。HTTPSからHTTPに
アクセス

回答:


128

これはテストされていませんが、mod_rewriteを使用して動作するはずです。

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

1
どうすれば機能しますか(このコードを機能させるには、このコードからドメインに何を変更する必要がありますか?)
Enve

1
Enve:サイトのvhost_ssl.conf構成(またはサイトのルートにある.htaccess)に追加するだけです。何も変更する必要はありません。動的に同じホスト名とURLパスを使用します。
ダレンフェルトン2013年

1
クエリ文字列もキャッチしたいと思うかもしれません。よくわかりませんが、上記のスニペットでは、httpsからhttpにクエリ文字列を転送できません。
Rustavore 2013年

12
以下のKieronが指摘しているように、ミラーサーバーに有効な証明書がない場合、これは機能しません。証明書が無効であるため、依然として大きな赤い警告が表示されます。httpsを使い始めると、基本的にそれで行き詰まります。あなたの残りの人生を通してそれを支払う準備をしてください。支払いを停止すると、httpsリンクをブックマークしたユーザーはアクセスできなくなります。
スティーブンチェン

2
残りの人生の代金を払っていますか?HTTPSは引き続き使用できますが、PKIプロバイダーを変更して、より安価な新しい証明書を取得できます。はい、数ドル払いますが、ドメイン名とホスティングについても同様です。PKI証明書はドメイン名に比べて高価ではなくなり、ホスティング/帯域幅のコストに比べてわずかになりました。
verdy_p

71

書き換えエンジンが起動するのは、HTTPリクエストを受信したときだけです。つまり、クライアントがリクエストを送信するための接続をセットアップするには、証明書が必要です。

ただし、バックアップマシンが同じホスト名を持っているように見える場合(クライアントに関する限り)、メインの運用マシンと同じ証明書を使用できない理由はありません。


1
どうすればこの制限を克服できますか?同じ問題が発生しています。リダイレクトの前にブラウザーから証明書エラーを取得します。
Sandeep Balagopal

証明書エラーがある場合は、HTTPにリダイレクトして戻すとよいでしょう
Jeffrey the Giraffe

それはそもそもHTTPSの目的を完全に
無効にし

12

ejunkerの回答に基づくと、これは私にとって有効なソリューションであり、単一のサーバーではなくクラウド環境で機能します

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

301を使用しても、少し危険です。301は永続的に削除されることを意味し、httpsからhttpへの移行は一時的なものだと思います。短所は、ユーザーのためになる何のためにこの受け入れ答えを参照してくださいstackoverflow.com/questions/1393280/...
ユスフtezel

301/302の永続的/一時的な区別は、検索エンジンにのみ関連します。
matthewv789

9

.confファイルを使用している人のために。

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>

8

上記の解決策のいずれもあなたにとってうまくいかない場合(私にとってはうまくいかなかった)、ここに私のサーバーで働いたものがあります:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

6
多くの場合、L,(「最後のルール」を意味する)は必要ありません。ワードプレスまたは別のCMSを使用している場合、このLフラグにより​​、ページ要求が正しくルーティングされない場合があります。代わりに使用:RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Rustavore

5

cloudflareを使用した場合、上記のすべてが機能しませんでした。これは私のために機能しました:

RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

これは間違いなくプロキシなしで機能します:

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

3

可能な場合は、mod_rewriteを使用しないことをお勧めします。

あなたの場合、書き換えをこれで置き換えます:

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

<If>ディレクティブは、このあたりとしてはApache 2.4+でのみ利用可能ですこちらのブログ


ホストされた環境では、Apacheのバージョンを確認できます/usr/sbin/httpd -v
Serge Stroobandt

1

これは私にとってはうまくいきます。

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
    Redirect "https://www.example.com/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # ... 
</VirtualHost>

必ずポート80と443の両方をリッスンしてください。


0

Wordpressのウェブサイトでは私にはうまくいかない答えがありますが、次の働きがあります(他の答えと似ていますが少し変更があります)

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

すべてのREQUEST_URIでこのようなルールを盲目的に使用しないでください(URIにフォームデータがある場合、またはリクエストメタデータにCookie /セッションIDがある場合は使用しないでください)。静的な公開ページ/画像にのみ使用してください。JavaScriptまたはアクティブなコンポーネント(特に、スクリプト可能なビデオストリーム、またはアクティブなPDFは、ユーザーによってデジタル署名されていない限り、完全に避けてください!JavaScriptにデジタル署名することはできません。安全なドメインのみに保持してください)。
verdy_p

注:一部の画像形式はアクティブでスクリプト可能です。たとえば、SVGに注意してください。HTTPからSVG画像をロードし、マルウェアがSVGコンテンツにスクリプトを挿入することによって収集される一部のHTTPS Webサイトへの攻撃を見てきました...理想的には、ブラウザーはHTTPサブコンテンツをHTTPSから分離し、サンドボックス(つまりCORS)に配置する必要があります同じドメイン名であってもセキュリティ制限を適用する必要があります...)したがって、「http://(domain)/ ...」と「https://(domain)/」は、同じTCPポート番号上にあっても、CORS(同じオリジンではない)。
verdy_p

@verdy_p、「サイトの302リダイレクトを使用して」とはどういう意味ですか?これらのHTTPリソース要求を利用するには、最初にサーバーサイト(またはDNSサーバーやルーターなどのTCP / IPレベルの参加者ノード)を所有している必要があります。
Sz。

必ずしも。ドメインのHTTPSは安全ですが、同じドメインのHTTPは安全ではありません(エクスプロイトはDNSSECを使用している場合でもIP、ルーター、またはDNSサーバーを制御する必要はありません。エクスプロイトはIPスプーフィングを使用するだけで、HTTPSがなければ安全に検出できません。安全なセッション)。したがって、HTTPSサイトは画像を(同じドメイン上でも)HTTPで提供しないことでホストする必要があると主張します(アクティベーションクリックを必要とするブラウザや、安全でない画像をマスクするブラウザでは、デフォルトで拒否されています)。HTTPSとHTTPの混在は禁止する必要があります。サイトはHTTPパーツ(トラックピクセルなど)に対して攻撃可能です。
verdy_p

-6

私が知っている限り、単純なメタリフレッシュもエラーを引き起こすことなく機能します:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">

12
反対票を投じた人が反対票を投じた理由を説明するコメントを残してほしいと思います。個人的には、開発者としてのあなたが開発対象のサーバーにアクセスできなかったが、ページにアクセスできなかった場合を除き、私はこの答えを選びません。1つの問題は、これを機能させるために、すべてのページのすべてのパスをハードコーディングする必要があることです。重要なユースケースでJavaScriptが有効になっていると想定できる場合は、JavaScriptを使用してhttpに変更することをお勧めします。上記の回答はサーバーで発生するため、JavaScriptを必要としないため、より適切です。
Rustavore 2013年

2
単に:htaccessはそれよりもはるかに優れたオプションだからです。また、証明書がない場合にhttpsプロトコルをhttpにリダイレクトする問題は修正されません。
midudev 2013年

1
アクションは、提供される可能性のある「a」ドキュメントではなく、サーバーによって処理される必要があります。
albal 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.