web-dev-qa-db-ja.com

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

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

266
Cat

更新: この答えは数年前に受け入れられていますが、そのアプローチは に対して現在推奨されている Apacheのドキュメントでは - /になっています。代わりにRedirectを使用してください。 この答え を参照してください。


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

出典

273
Reese Moore

Apache docs 書き換えの使用を推奨しない:

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

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

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

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

この記事は、質問が回答された後に初めて登場したかもしれませんが、現在の方法であるようです。

323
ssc

301リダイレクトをおすすめします。

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

この質問 で言っていたように、すべてのHTTPリクエストを同等のHTTPSに盲目的にリダイレクトすることは避けてください。セキュリティに誤った印象を与える可能性があります。代わりに、HTTPサイトの「ルート」をHTTPSサイトのルートにリダイレクトし、そこからHTTPSにのみリンクするようにします。

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

たとえば、HTTPSで提供されているページの1つに<form action="http://example.com/doSomething">という形式があり、平文で送信してはいけないデータが送信された場合、ブラウザは最初に完全な要求(POSTの場合はエンティティを含む)をHTTPに送信します。最初のサイトリダイレクトはすぐにブラウザに送信され、多数のユーザーが警告を無効にするか無視するので無視される可能性があります。

もちろん、HTTPSサイトへのリンクを提供してもHTTPサイトへのリンクを提供してしまうと、HTTPSサイトと同じIPアドレスのHTTPポートでリスニングするとすぐに問題が発生する可能性があります。ただし、2つのサイトを「ミラー」として維持することは、ユーザーをHTTPSにリダイレクトすることで自動的に修正されると想定する傾向があるため、失敗する可能性が高まるだけですが、手遅れになることがよくあります。 ( この質問でも同様の議論がありました

34
Bruno

私はドメイン上のhttpsとwwwのための最良の方法はそれであることがわかりました

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

これは動作する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 Approach

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

コピー元: www.letuslook.org

13

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

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

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

RewriteEngine On

RewriteCond %{HTTPS} off

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

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

RewriteEngine Onと重複しないでください。

RewriteCondとRewriteRuleで始まる行が、既存のRewriteEngine Onの直後にくるようにしてください。

6
OpenWebWar

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
AnarchyOutlaw

最善の解決策はあなたの要求次第です。これは以前に投稿された回答の要約で、いくつかのコンテキストが追加されています。

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]

しかし、このリダイレクトについて考えを変える可能性がある場合は注意してください。ブラウザは非常に長い間それを覚えていて、それが変わったかどうか確認しません。

Webサーバーの設定によっては、最初の行RewriteEngine Onは必要ないかもしれません。

PHP解決策を探しているなら、 $ _SERVER配列ヘッダ関数 を見てください。

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

リダイレクトのために上で説明されていることをすべて行います。ヘッダに「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

4
Waqas

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

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

[あなたのドメイン名]はあなたのウェブサイトのドメイン名です。

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

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

すべての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
starkeen

あなたがあなたのサイトの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は可能な限りこの方法を使用しないことを推奨します。ただし、ユーザーのデータが安全であることを確認するために、開発側で特別なチェックが必要になるだけです。うまくいけば、これは私たちのホスティングサービスの終わりの制限のために推奨されない方法の使用を検討しなければならないかもしれない他の誰かに役立つ。

2
F. Scott Gale

.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をHTTPにリダイレクトする方法

1
Roshan Padole

他の目的で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
SashaK

もしあなたがApacheを使っているのであれば、mod_rewriteが最も簡単な解決策であり、それを行う方法をオンラインでたくさんのドキュメントを持っています。例: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

0
vcsjones

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のみを実行してください。

0
Bhaskara Arani

この問題に対する別の強みは、ロードバランサが効果を発揮するときです。

状況は次のとおりです。 - ブラウザからLoad Balancerへのトラフィック、およびその逆のトラフィックはHTTPSです。 - Load Balancerと実際のWebServer間のトラフィックはHTTPです。

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

承認された回答のRewriteConditionは機能しません。それはループを与えるか、それはただうまくいきません。

質問は次のとおりです。ロードバランサでこれを機能させる方法。

(またはロードバランサが間違って設定されています。それが私がWebHosting会社に問題を移すことができるのでそれが私が望んでいるものです:-)

0
BertC

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

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

0
Ehsan Sattari

わたしにはできる:

<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%{SERVER_PORT}!^ 443 $ の代わりに使用できます RewriteCond%{HTTPS}!on

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

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

ボーナス:

ServerAlias www.example.com example.com

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

0
aalesund

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

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

Httpsトラフィックを受け入れ、それをhttpを使用してサーバーにルーティングするAmazon Web Services Elastic Load Balancerを使用している場合、すべてのhttpトラフィックをhttpsにリダイレクトする正しい方法は次のとおりです。 https:// aws) .Amazon.com/premiumsupport /ナレッジセンター/ 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トラフィックを向けようとしないでしょう。

0
ScottyB