web-dev-qa-db-ja.com

ホスト名をハードコーディングせずにApacheでSSLを強制する

私は考えるこれを並べ替えました(主に質問に感謝します 。htaccessを使用してハードコーディングせずにwww以外をwwwにリダイレクトする方法は? )、しかし私はまだ完全ではありませんいくつかのことを理解します。

サーバーへのすべての非SSL接続を強制的にSSLにルーティングしたいと思います。私は仮想ホストを1つしか持っていません(そしてそれはサーバーの存続期間中は確実に当てはまります)が、ステージングと本番用のhttpd.confファイルが同一のままになるように、ドメイン名をハードコーディングすることは避けたいと思います。

次のようなmod_rewriteルールを使用してSSLを使用するようにリクエストを強制できることを知っています。

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

または

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

ただし、比較的簡単な質問が2つあります。

  1. 何らかの理由で、これらのRewriteCondステートメントの1つを他のステートメントよりも優先する必要がありますか?おそらく、%{SERVER_PORT}変数を使用すると、たとえば、ポート8000​​の接続は、引き続き平文で提供されますか?見落としている%{HTTPS}変数の使用を避けるべき理由はありますか?
  2. RewriteRuleステートメントの%{HTTP_Host}変数は尊重され、リクエストからのHost:ヘッダーが何であれ、自動的に置き換えられますか?これが機能しない状況はありますか?

違いが生じる場合は、RedHatでmod_sslを使用してApache2を実行し、サイトはDrupal 7を使用します。

比較的ばかげた質問でごめんなさい。 Apache sysadminは私の仕事の中核ではないので、できる限り混乱させようとしています。皆さんありがとう!

4
Owen Blacker

私はいつも次のようなものを使用しました:

_RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}/$1 [R=301,L]
_

たまに80以外のポートでHTTPを提供するのが好きだからです。まあ、それは好きではありませんが、必要な場合もあります。たとえば、SSLが使用されている場合、_%{HTTPS}_はtrueになります。ポート80。

普段使っていると思います

_RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
_

_%{HTTP_Host}_は常に、クライアントによって_Host:_ヘッダーとして設定されたものになります。

しかし、これを行う別の方法があることに気づきました。

_<VirtualHost *:80>
   ServerName mysite.example.com
   Redirect permanent / https://mysite.example.com/
</VirtualHost>
_

上記のブロックにDocumentRootがないことに気付くでしょう。リダイレクトする場合すべて、必要ありません。

サイトの一部をSSLにリダイレクトしたいだけの場合は、

_Redirect permanent /secure https://mysite.example.com/secure
_

リダイレクトオプションは、狂気のレベルが1つ少ないため(mod_rewriteによって非常に親切に提供されているため)、フルサイトのHTTPS強制にはより適していると思います。

ロード/実行するモジュールが1つ少なくなるため、さらに高速になる可能性があります。

7
Tom O'Connor