すべてのHTTPリクエストをHTTPSにリダイレクトする方法


294

私のサイトのすべての安全でないHTTPリクエスト(例http://www.example.com)をHTTPS(https://www.example.com)にリダイレクトしようとしています。私はPHPを使用しています。.htaccessでこれを行うことはできますか?


1
これhttpdは、PHPではなくを使用して行うことができます(また、行う必要があります)。
2010年

2
@jnpcl、私はhttpdソリューションがPHPベースのソリューションよりも優れていることに同意しますが、体系的なリダイレクトは一般的に良い習慣だとは思いません。ユーザーを常にHTTPSにリダイレクトする場合は、「エントリポイント」(サイトへの最初のリンク)からユーザーをそこに送信します。途中では行わないでください。考えられるデータが漏洩する可能性があります。保護されています(その瞬間的なリダイレクトに気付かない場合)。
Bruno

@Bruno:重複したHTTPリクエスト、クエリ文字列が失われる可能性、ユーザーが手動で入力する可能性など、より多くのことを考えていましたhttp://
10

@jnpclは確かに良い点です。私は単に人々がこの種のリダイレクトを求めてサイトのセキュリティを向上させる傾向がある一方で、実際にはそれを向上させないことを示唆していました(それは同じ要求が最初にプレーンHTTPを通過することを妨げないため) 。
Bruno

8
@outis:あなたが投稿した最初のリンクはこの質問です。
メイ

回答:


305

更新:この回答は数年前に受け入れられましたが、Apacheのドキュメントはそのアプローチが推奨されていないことに注意してください。Redirect代わりに使用してください。この回答を参照してください。


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

24
@Cat、私が私の回答/コメントで言っていたように、「すべての安全でないHTTP [...]をHTTPSにリダイレクトしようとしている」場合、このアプローチはそれらの要求を安全にせず、ブラウザにそれらを作るだけです2回、1回は安全ではなく、1回は安全です。
Bruno

13
実際にすべきことは、HSTSをこれと組み合わせて使用することです。
リースムーア

3
これは私のバージョンのapache(Centos 7にパッケージされている2.4.6)のバグかもしれませんが、特定のURLで問題があります。たとえば、「@」記号http://server/foo?email=someone%40example.comへのリダイレクトhttps://server/foo?email=someone%2540example.comは、URLで2回引用されます。@sscの回答でメソッドを使用しても、この問題はありません。
psmears 2015年

2
間違った答え。サブフォルダー内のURLではなく、ベースURLのみをリダイレクトします。RewriteRule(。*)https://%{HTTP_HOST}%{REQUEST_URI} [R = 301、L]が正解です
FredTheWebGuy

7
彼らは必ずしもそれに反対することを推奨しているわけではありませんIn the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
アダム

338

Apacheのドキュメントは、リライトを使用しないことをお勧めします。

httpURL をにリダイレクトするhttpsには、次の手順を実行します。

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

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

このスニペットは、質問で尋ねられたようにではなく、メインサーバー構成ファイルに挿入する必要があります.htaccess

この記事は、質問が出されて回答された後でのみ登場する可能性がありますが、現在の方法のようです。


11
これが現在の答えです。しかし、「SSL構成」で正確に何が行われるのでしょうか。完全な例は本当に役に立ちます。
ベン

6
@ベン:オンラインで広く文書化されている別の質問です。ついでに、私は昨日、ほぼ完全な例を追加しました:serverfault.com/q/597012/26210これは、SSL構成で何が行われるかを理解できるかもしれません
ssc

46
これは素晴らしいヒントです。しかし、Apache docでは、次のようにも述べています。「httpからhttpsへのリダイレクトの場合、メインサーバーの構成ファイルにアクセスできず、このタスクを実行する必要がある場合は、RewriteRuleの使用が適切です。代わりに.htaccessファイル。」私にとってはそうです...
peter_the_oak 2015

4
@ user1844933 permanentキーワードを使用する場合、効果は同じです(ブラウザーは301リダイレクトを受け取ります)。例:Redirect permanent "/" "https://example.com"
BeetleJuice

2
@Whitecat Centos 6では、ファイルは/etc/httpd/conf/httpd.confにあります
dstonek

141

私は301リダイレクトをお勧めします:

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

7
おかげで、これは私にとっては[L]
うまくいき

1
うん。これもそれもルートのサブフォルダ内のすべてのURLを、以来、正しい答えである
FredTheWebGuy

これはhtaccessファイルの最上位にありますか?
CodyBugstein 2017

1
@CodyBugsteinそれは私がいつもそれを置く場所であり、それは常に機能します。
Daan van den Bergh

3
すべての回答に1つ欠けているものがあります。すべてのページをhttpsにリダイレクトする場合は、リダイレクトのコードを.htaccessファイルの先頭に配置する必要があります。
Vadim Anisimov 2018年

35

この質問で言っていたように、セキュリティの誤った印象を与える可能性があるため、すべてのHTTP要求を対応するHTTPSに盲目的にリダイレクトしないことをお勧めします。代わりに、HTTPサイトの「ルート」をHTTPSサイトのルートにリダイレクトし、そこからHTTPSにのみリンクする必要があります。

問題は、HTTPSサイトのリンクまたはフォームによってクライアントがHTTPサイトにリクエストを送信すると、リダイレクトの前にそのコンテンツが表示されることです。

たとえば、HTTPS経由で配信されるページの1つに<form action="http://example.com/doSomething">、明確に送信する必要のないデータを送信するフォームがある場合、ブラウザはまず完全なリクエスト(POSTの場合はエンティティを含む)をHTTPサイトに送信します最初。リダイレクトはすぐにブラウザーに送信され、多くのユーザーが警告を無効にするか無視するため、無視される可能性があります。

もちろん、HTTPSサイトへのリンクを提供するというミスが、最終的にHTTPサイトへのリンクになるという誤りは、HTTPSサイトと同じIPアドレスのHTTPポートで何かをリッスンするとすぐに問題を引き起こす可能性があります。ただし、2つのサイトを「ミラー」として維持すると、ユーザーをHTTPSにリダイレクトすることで自動修正されると思われる傾向があるため、間違いを犯す可能性が高まるだけですが、手遅れになることがよくあります。(この質問でも同様の議論がありました


1
サイト全体をHTTPSとして提供することを決定する場合、このようなリダイレクトは理にかなっています。ランディングページにhttpを指定したため、ユーザーに403を取得してほしくない。誰かがリンクにhttpを指定し、それを悪いプロダクションにデプロイすることに同意します。リダイレクトが設定されていても、テスト中にキャッチする必要があります。この "could"はリダイレクトを行わずに発生するため、 "could"の引数は好きではありません。平文で送信することを確認した後、それは403の受信の代わりにリダイレクトを除いて、安全なブラウザでテストするときの症状は同じです
デレク・リッツ

ええ、誰かが誤ってhttpをフォームアクションに入れた場合に失敗するメリットはあると思いますが、ほとんどの場合、入力されたURLに寛容であることの方が重要だと思われます。
Daniel Lubarov、2014年

4
@Daniel、ユーザーがURLを入力するときに寛大であることは有用だと私は同意します。これは、開発/テスト中にこの機能をオフにして、本番環境(または開発/テストの最終段階)でオンにするほうがよいケースの1つだと思います。
Bruno

DNSでhttpからhttpsを実行しないでください。
ムハンマドウメール2015年

1
@MuhammadUmer、これはDNSとは関係がないため。通常は同じホスト名を使用しますが、ホスト名が異なっていても、プロトコルとポートを変更する必要があります。
Bruno

18

ドメインでのhttpsおよびwwwの最善の方法は

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

http://www.example.com/...2つの条件が暗黙的にAND されるため、これはリダイレクトされません。代わりにORする必要があります。OR最初の条件にフラグを含めます(正規表現のリテラルドットをエスケープすることを忘れないでください)。ただし、HSTSを実装している場合は、単一のリダイレクトでHTTPSとwwwにリダイレクトしたくない場合、最初にHTTPSにリダイレクトする必要があります。
MrWhite、2018年

このテキストはどこに置くのですか?
アーロンフランケ

同様のタイプの質問について。誰かが以下の質問を手伝ってくれる?stackoverflow.com/questions/59503217/...
appsntech

14

これは動作するHTMLリダイレクトアプローチですが、最善ではありません。

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

PHPのアプローチ

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess approch

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

コピー元: www.letuslook.org


どこに.htaccess行くの?また、そのリンクは機能していません。
アーロンフランケ

8

私はhttpからhttpsにリダイレクトするこの方法が好きです。サイトごとに編集する必要がないからです。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

このテキストはどこに置くのですか?
アーロンフランケ

6

.htaccessファイルで次のコードを使用すると、訪問者をサイトのHTTPSバージョンに自動的にリダイレクトします。

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

既存の.htaccessファイルがある場合:

RewriteEngine Onを複製しないでください。

RewriteCondとRewriteRuleで始まる行が、既存のRewriteEngine Onの直後に続くことを確認してください。


LとRはどういう意味ですか?
アーロンフランケ

5

これは、GoDaddy.comによると、.htaccessを使用してHTTPをHTTPSにリダイレクトする適切な方法です。コードの最初の行は自明です。コードの2行目はHTTPSがオフになっているかどうかを確認し、オフになっている場合は3行目のコードを実行してHTTPをHTTPSにリダイレクトします。それ以外の場合は3行目のコードは無視されます。

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

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828


5

最適なソリューションは、要件によって異なります。これは、いくつかのコンテキストが追加された、以前に投稿された回答の要約です。

Apache Webサーバーを使用していて、その構成を変更できる場合は、Apacheのドキュメントに従ってください。

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

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

しかし、.htaccessファイルで実行できるかどうかも尋ねました。その場合は、ApacheのRewriteEngineを使用できます。

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

すべてが正常に機能していて、ブラウザにこのリダイレクトを記憶させたい場合は、最後の行を次のように変更することにより、永続的であると宣言できます。

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ただし、このリダイレクトを変更する可能性がある場合は注意してください。ブラウザはそれを非常に長い間記憶し、変更されたかどうかをチェックしません。

RewriteEngine Onウェブサーバーの設定によっては、最初の行は必要ない場合があります。

PHPソリューションを探す場合は、$ _ SERVER配列ヘッダー関数を見てください。

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 

ApacheのドキュメントではRewriteルートを推奨していないようです。リダイレクトについてはどうですか?他に何を.htaccessファイルに入れることができますか?
アーロン・フランケ

はい、リダイレクトが推奨され、.htaccessで使用できます。ただし、httpトラフィックをhttpsにリダイレクトするだけの条件を追加することはできません。httpsもリダイレクトします->無限リダイレクトループ。上記のhttp(ポート80)で使用されるVirtualHostディレクティブにリストしました。.htaccessはそのディレクティブをサポートしていないため、ここではRedirectを使用できません。
マイケル

4

次のコードを.htaccessファイルに追加します。

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

[your domain name]はWebサイトのドメイン名です。

上記のコードの最後の行を次のように置き換えることで、ドメイン名から特定のフォルダーをリダイレクトすることもできます。

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]

LとRはどういう意味ですか?
アーロンフランケ

4

リダイレクトについては、上記で説明したすべてを実行してください。ヘッダーに「HTTP Strict Transport Security」を追加するだけです。これにより、中間者攻撃を回避できます。

Apache構成ファイル(/etc/apache2/sites-enabled/website.confおよび/etc/apache2/httpd.confなど)を編集し、VirtualHostに以下を追加します。

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security


2

すべてのhttpリクエストをにリダイレクトするにはhttps、次を使用できます。

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

mod-rewriteが有効になっておらず、Apache 2.4を使用してRedirectいる場合は、内部ifディレクティブを使用してhttpリクエストをにリダイレクトすることもできますhttps

Apache 2.4。

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>

2

サイトのapache設定に直接アクセスできない状況で、多くのホストされたプラットフォームがこの方法でまだ制限されている場合は、実際には2段階のアプローチをお勧めします。Apache自体が、HTTPからHTTPSへのmod_rewriteよりも何よりもまず構成オプションを使用する必要があると文書化している理由。

まず、上記のように、.htaccess mod_rewriteルールを設定します。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

次に、PHPファイルで(状況に応じてこれを行う必要があります)、一部のサイトはすべてのリクエストを単一のPHPファイルにまとめ、他のサイトはニーズと行われるリクエストに応じてさまざまなページを提供します):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

上記は、セキュリティで保護されていない環境でセキュリティで保護されたデータを公開する可能性のあるコードの前に実行する必要があります。したがって、サイトはHTACCESSおよびmod_rewriteを介した自動リダイレクトを使用しますが、HTTPS経由でアクセスしない場合、スクリプトは出力を提供しません。

ほとんどの人はこのように考えていないので、Apacheは可能な限りこの方法を使用しないことをお勧めします。ただし、ユーザーのデータが安全であることを確認するために、開発側で追加のチェックを行うだけです。うまくいけば、これは、ホスティングサービスの制限により、非推奨のメソッドの使用を検討する必要がある他の誰かを助けることになります。


1

.htaccessを通じてこれは役立ちます。

RewriteEngine On


RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

また、詳細はこちらをご覧ください。HttpをHttpsにリダイレクトする方法は?


1
これは、「リダイレクトが多すぎます」というエラーが発生し、allowOverrideプロパティを変更できない人にとっての解決策です。
エボクローム2017年

1

他のものにmod_rewriteが必要でない限り、ApacheコアIFディレクティブを使用する方がよりクリーンで高速です。

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

wwwプレフィックスのない単一の正規ドメインを確保するなど、IFディレクティブにさらに条件を追加できます。

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

すべてに対してmod_rewriteを使用することには、慣れ親しみの慣性がたくさんありますが、これがうまくいくかどうかを確認してください。

詳細:https : //httpd.apache.org/docs/2.4/mod/core.html#if

実際の動作を確認するには(www。やhttps://なし、または.comの代わりに.netを使用してみてください):https : //nohodental.com/(作業中のサイト)。


1

このコードを.htaccessファイルに持って行く HTTPをHTTPSに自動的にリダイレクトする

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


こんにちは、回答に感謝します。あなたの回答には、他の既存の回答にはないものは何ですか?
Gricey

同様のタイプの質問について。誰かが以下の質問を手伝ってくれる?stackoverflow.com/questions/59503217/...
appsntech

0

私のサイトのすべてのページを、httpからhttpsの類似ページに強制的にリダイレクトする方法を見つけました。

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

0
 Redirect 301 / https://example.com/

(上記の答えがどれもうまくいかなかったときに私のために働きました)

ボーナス:

ServerAlias www.example.com example.com

(固定https:// www .example.comが見つかりません)


0

これにより、すべてのURLがhttpsおよびwwwにリダイレクトされます。

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

0

Tomcatサーバーから実行する場合は、以下の手順に従ってください

スタンドアロンのApache Tomcat(8.5.x)HTTPサーバーでは、ユーザーがwww.domain.comと入力した場合に自動的にhttps(www.domain.com)サイトに転送されるように構成する方法を説明します。

終了タグの前に[Tomcat_base] /conf/web.xmlに以下を含める2ステップの方法

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

[Tomcat_base] /conf/server.xmlコネクタ設定を設定します。

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

注:https構成をすでに行ってリダイレクトを試みている場合は、ステップ1のみを実行してください。



-1

この問題の別の利点は、ロードバランサーが機能する場合です。

状況は次のとおりです。-ブラウザからロードバランサへのトラフィックとその逆のトラフィックはHTTPSである必要があります-ロードバランサと実際のWebサーバー間のトラフィックはHTTPです。

したがって、PHPまたはApacheのすべてのサーバー要求変数は、接続が単なるHTTPであることを示しています。また、サーバー上のHTTPディレクトリとHTTPSディレクトリは同じです。

承認された回答のRewriteConditionが機能しません。ループが発生するか、機能しません。

問題は、ロードバランサーでこれを機能させる方法です。

(または、ロードバランサーの構成が間違っています。これは、問題をWebホスティング会社に移すことができるため、私が望んでいることです:-))


リダイレクトは、代わりにロードバランサーで発生する必要があります。ロードバランサーのタイプに応じて、これは構成で可能であるか、受け入れられた回答が機能するApacheインスタンス自体です。単一のノードでは行わないでください。
marc82ch 2015

-1

httpsトラフィックを受け入れ、httpを使用してサーバーにルーティングするAmazon Web Services Elastic Load Balancerを使用している場合、すべてのhttpトラフィックをhttpsにリダイレクトする正しい方法は、https://aws.amazonで説明されています。 com / premiumsupport / knowledge-center / redirect-http-https-elb

ここで説明されているように、ロードバランサからのhttpリクエストに常に含まれるX-Forwarded-Protoヘッダー(httpまたはhttpsを含む)を使用します。https//docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- forwarded-headers.html

httpd.confファイルで:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

またはルートの.htaccessファイルで:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

おまけ:ローカルの開発マシンでhttpトラフィックをリダイレクトしようとしません。


-1

わたしにはできる:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

たとえば、http:// server / foo?email = someone%40example.comは問題なく正常にリダイレクトされます。Webサイトのルートフォルダーにある.htaccessファイル(たとえば、public_htmlという名前)。RewriteCond%{HTTPS}!onの代わりにRewriteCond%{ SERVER_PORT}!^ 443 $を使用することが可能 です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.