私は自分のサイトのすべての安全でないHTTPリクエスト(例:http://www.example.com
)をHTTPS(https://www.example.com
)にリダイレクトしようとしています。私はPHP btwを使用しています。これを.htaccessで実行できますか?
更新: この答えは数年前に受け入れられていますが、そのアプローチは に対して現在推奨されている Apacheのドキュメントでは - /になっています。代わりにRedirect
を使用してください。 この答え を参照してください。
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
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
に入る必要があります。
この記事は、質問が回答された後に初めて登場したかもしれませんが、現在の方法であるようです。
301リダイレクトをおすすめします。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,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]
これは動作する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
私はhttpからhttpsにリダイレクトするこの方法が好きです。サイトごとに編集する必要はないからです。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
.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]
しかし、このリダイレクトについて考えを変える可能性がある場合は注意してください。ブラウザは非常に長い間それを覚えていて、それが変わったかどうか確認しません。
Webサーバーの設定によっては、最初の行RewriteEngine On
は必要ないかもしれません。
PHP解決策を探しているなら、 $ _SERVER配列 と ヘッダ関数 を見てください。
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI']);
}
リダイレクトのために上で説明されていることをすべて行います。ヘッダに「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
次のコードを.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]
すべての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をHTTPにリダイレクトする方法
他の目的で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/ (現在作業中のサイト)。
もしあなたがApacheを使っているのであれば、mod_rewriteが最も簡単な解決策であり、それを行う方法をオンラインでたくさんのドキュメントを持っています。例: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
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のみを実行してください。
この問題に対する別の強みは、ロードバランサが効果を発揮するときです。
状況は次のとおりです。 - ブラウザからLoad Balancerへのトラフィック、およびその逆のトラフィックはHTTPSです。 - Load Balancerと実際のWebServer間のトラフィックはHTTPです。
そのため、PHPまたはApacheのすべてのサーバー要求変数は、接続が単なるHTTPであることを示しています。また、サーバー上のHTTPディレクトリとHTTPSディレクトリは同じです。
承認された回答のRewriteConditionは機能しません。それはループを与えるか、それはただうまくいきません。
質問は次のとおりです。ロードバランサでこれを機能させる方法。
(またはロードバランサが間違って設定されています。それが私がWebHosting会社に問題を移すことができるのでそれが私が望んでいるものです:-)
このコードをあなたに持っていく.htaccessファイル HTTPを自動的にHTTPSにリダイレクトする
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
わたしにはできる:
<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
Redirect 301 / https://example.com/
(上記の答えのどれもがうまくいかなかったとき私のために働いた)
ボーナス:
ServerAlias www.example.com example.com
(固定https:// www 。example.comが見つかりません)
私のサイトのすべてのページをhttpからhttpsの類似したページにリダイレクトする方法を見つけました。
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
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トラフィックを向けようとしないでしょう。