web-dev-qa-db-ja.com

htaccess http to httpsリダイレクトで手をかざす

Httpリクエストからhttpsに切り替えるためにhtaccessファイルを処理する最良の方法を調査してきましたが、実際のドメインに入力するのではなく、サーバー名リクエストを使用して、サーバーポートからのリクエストのベースから、 Apache構成ファイルとhtaccessを完全に無視します。

もちろん、私の目標はhttpからhttpsを達成するための最もSEOに優しい方法です!

ここに私の現在のhtaccessルールがあります:

Options +FollowSymLinks 
RewriteEngine on 
RewriteCond %{HTTP_Host} ^example.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301]
RewriteRule ^$ /index.html [L]

このコードをhttpsに強制する最もエレガントな方法は何ですか? このツール を超えてテストされていませんが、これは私がこれまでに思いついたものです

Options +FollowSymLinks 
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
RewriteRule ^$ /index.html [L]
3
Virage

このような単純なケースでは、ルールを書き換える必要はありませんが、確かに同じ目標を達成することはできます。

HTTPホストを説明する特定のVirtualHost(したがって、アドレスの最後に:80を持っている)では、次のものが必要です。

RedirectPermanent / https://www.example.com/

https://httpd.Apache.org/docs/2.4/mod/mod_alias.html#redirectpermanent を参照してください。Permanentバージョンが気に入らない場合は、Temporaryバージョンもあります。

ドキュメントによると、RedirectPermanent X YRedirect permanent X Yと同じであり、permanentは次のように定義されます。

リソースが永続的に移動したことを示す永続リダイレクトステータス(301)を返します。

また、可能であれば、実際にApache構成を編集して.htaccessファイルを削除することは、多くの理由(パフォーマンス、セキュリティ、シンプルさ)のために良い方向です

4
Patrick Mevzek

実際のドメインに入力するのではなく、サーバー名の要求を使用して、サーバーポートから要求を送信することから、Apache構成ファイルを編集してhtaccessを完全に無視するまで、すべてを見てきました。

「Apacheの設定ファイルは非常に柔軟で複雑な獣であるため」「猫の皮を剥ぐ多くの方法」があることとは別に、「最良」の方法は他の多くの要因に依存することができます。

  • サーバー構成。 (例:UseCanonicalName Onは設定されていますか?)
  • メインサーバーの設定または<VirtualHost>コンテナにアクセスできますか?または、.htaccess(共有サーバー環境など)に制限されていますか。
  • 非標準のポートでサイトを実行していますか?
  • 同じvHostから複数のドメインをホストしていますか?
  • ホスト名を明示的に含めない一般的なソリューションが必要ですか?ホスト間でコピー/貼り付けできるソリューションが必要ですか? 「一般的な」ソリューションは、必ずしも1つのホストにとって最良の(または「最も安全な」)ソリューションではありません。 (サーバーがどのように構成されているかわからないため、誰かが使用する方法を提案している場合、ホスト名を明示的にハードコーディングすることが「安全な」ソリューションであることがよくあります。)
  • HSTS の実装を計画していますか? (もしそうなら、おそらくHTTPからHTTPSにリダイレクトするときにホスト名を正規化したくないでしょう。)
  • サイトのセキュリティ証明書はどのように管理されていますか?例えば。 SSL証明書はアプリケーションサーバーに直接インストールされていますか、またはSSLプロキシ(Cloudflareなど)を使用していますか? SSLプロキシを使用している場合、HTTPSおよびSERVER_PORTサーバー変数はおそらく役に立たないでしょう。 (一部のホストは代替environment変数を設定します-しかしこれはserver specific。)

このコードをhttpsに強制する最もエレガントな方法は何ですか?

さて、「優雅さ」は主観的なものです。

サーバー設定にアクセスできる場合、.htaccessで実際にこれを行うべきではありません。代わりに、@ PatrickMevzekが示唆するように、関連する<VirtualHost>コンテナで簡単なmod_alias Redirectを使用する必要があります。これは、「簡単」、「安全」、およびより効率的です。

後で HSTS を実装する場合(特に HSTSプリロードリスト を取得する場合)、これはメインサーバー設定で実装するのが本当に簡単になります。 .htaccessでこれを実装するには、追加の複雑さが必要です。

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

それ以外の場合、.htaccessへのアクセス権しか持っていない場合、提案しているディレクティブに「間違った」ものはまったくありません。ただし、これは必ずしもeveryサーバーでは機能しない、またはeveryシナリオ。サブディレクトリに.htaccessファイルが追加されている場合、(偶然)オーバーライドされる可能性があります。


RewriteRule ^$ /index.html [L]

脇:DirectoryIndexが正しく設定されていれば、このルールは不要です。 (多分「特別な」何かが起こっていない限り?)

2
MrWhite

別のオプション;

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
1
Chaoley

あなたはとても近いです。これは、私が管理しているドメインの1つで使用するもので、問題なく機能します。

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://www.example.com/$1 [L]
0
Dave