私のサイトのすべての安全でないHTTPリクエスト(例http://www.example.com
)をHTTPS(https://www.example.com
)にリダイレクトしようとしています。私はPHPを使用しています。.htaccessでこれを行うことはできますか?
http://
私のサイトのすべての安全でないHTTPリクエスト(例http://www.example.com
)をHTTPS(https://www.example.com
)にリダイレクトしようとしています。私はPHPを使用しています。.htaccessでこれを行うことはできますか?
http://
回答:
更新:この回答は数年前に受け入れられましたが、Apacheのドキュメントではそのアプローチが推奨されていないことに注意してください。Redirect
代わりに使用してください。この回答を参照してください。
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
へのリダイレクトhttps://server/foo?email=someone%2540example.com
は、URLで2回引用されます。@sscの回答でメソッドを使用しても、この問題はありません。
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.
Apacheのドキュメントは、リライトを使用しないことをお勧めします。
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>
このスニペットは、質問で尋ねられたようにではなく、メインサーバー構成ファイルに挿入する必要があります.htaccess
。
この記事は、質問が出されて回答された後でのみ登場する可能性がありますが、現在の方法のようです。
permanent
キーワードを使用する場合、効果は同じです(ブラウザーは301リダイレクトを受け取ります)。例:Redirect permanent "/" "https://example.com"
私は301リダイレクトをお勧めします:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
この質問で言っていたように、セキュリティの誤った印象を与える可能性があるため、すべてのHTTP要求を対応するHTTPSに盲目的にリダイレクトしないことをお勧めします。代わりに、HTTPサイトの「ルート」をHTTPSサイトのルートにリダイレクトし、そこからHTTPSにのみリンクする必要があります。
問題は、HTTPSサイトのリンクまたはフォームによってクライアントがHTTPサイトにリクエストを送信すると、リダイレクトの前にそのコンテンツが表示されることです。
たとえば、HTTPS経由で配信されるページの1つに<form action="http://example.com/doSomething">
、明確に送信する必要のないデータを送信するフォームがある場合、ブラウザはまず完全なリクエスト(POSTの場合はエンティティを含む)をHTTPサイトに送信します最初。リダイレクトはすぐにブラウザーに送信され、多くのユーザーが警告を無効にするか無視するため、無視される可能性があります。
もちろん、HTTPSサイトへのリンクを提供するというミスが、最終的にHTTPサイトへのリンクになるという誤りは、HTTPSサイトと同じIPアドレスのHTTPポートで何かをリッスンするとすぐに問題を引き起こす可能性があります。ただし、2つのサイトを「ミラー」として維持すると、ユーザーをHTTPSにリダイレクトすることで自動修正されると思われる傾向があるため、間違いを犯す可能性が高まるだけですが、手遅れになることがよくあります。(この質問でも同様の議論がありました。)
ドメインでの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にリダイレクトする必要があります。
これは動作する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
行くの?また、そのリンクは機能していません。
.htaccessファイルで次のコードを使用すると、訪問者をサイトのHTTPSバージョンに自動的にリダイレクトします。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
既存の.htaccessファイルがある場合:
RewriteEngine Onを複製しないでください。
RewriteCondとRewriteRuleで始まる行が、既存のRewriteEngine Onの直後に続くことを確認してください。
これは、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
最適なソリューションは、要件によって異なります。これは、いくつかのコンテキストが追加された、以前に投稿された回答の要約です。
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']);
}
.htaccess
ファイルに入れることができますか?
次のコードを.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]
リダイレクトについては、上記で説明したすべてを実行してください。ヘッダーに「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
すべての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>
サイトの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は可能な限りこの方法を使用しないことをお勧めします。ただし、ユーザーのデータが安全であることを確認するために、開発側で追加のチェックを行うだけです。うまくいけば、これは、ホスティングサービスの制限により、非推奨のメソッドの使用を検討する必要がある他の誰かを助けることになります。
.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にリダイレクトする方法は?
他のものに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/(作業中のサイト)。
このコードを.htaccessファイルに持って行く HTTPをHTTPSに自動的にリダイレクトする
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
私のサイトのすべてのページを、httpからhttpsの類似ページに強制的にリダイレクトする方法を見つけました。
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
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のみを実行してください。
Apacheを使用している場合は、mod_rewriteが最も簡単なソリューションであり、その方法をオンラインで多くのドキュメントにまとめています。例:http : //www.askapache.com/htaccess/http-https-rewriterule-redirect.html
この問題の別の利点は、ロードバランサーが機能する場合です。
状況は次のとおりです。-ブラウザからロードバランサへのトラフィックとその逆のトラフィックはHTTPSである必要があります-ロードバランサと実際のWebサーバー間のトラフィックはHTTPです。
したがって、PHPまたはApacheのすべてのサーバー要求変数は、接続が単なるHTTPであることを示しています。また、サーバー上のHTTPディレクトリとHTTPSディレクトリは同じです。
承認された回答のRewriteConditionが機能しません。ループが発生するか、機能しません。
問題は、ロードバランサーでこれを機能させる方法です。
(または、ロードバランサーの構成が間違っています。これは、問題をWebホスティング会社に移すことができるため、私が望んでいることです:-))
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トラフィックをリダイレクトしようとしません。
わたしにはできる:
<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 $を使用することが可能 です。
httpd
は、PHPではなくを使用して行うことができます(また、行う必要があります)。