Apacheサーバーで、すべての着信http要求を同等のhttps要求にリダイレクトできるようにしたいと思います。キャッチは、ServerName
を指定せずにデフォルトの仮想ホストでこれを実行し、リクエストURLに表示されたサーバー名でリダイレクトが機能するようにすることです。私はこのようなものを望んでいます:
NameVirtualHost *:80
<VirtualHost *:80>
RedirectPermanent / https://%{SERVER_NAME}/
...
</VirtualHost>
これはRedirect
を使用して可能ですか、またはRewrite
に頼らなければなりませんか?
これを仮想ホスト設定に追加してみてください:
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_Host}$1 [R=301,L]
両方ともうまくいきます。しかし Apache docs によると、単純なリダイレクトには mod_rewrite
を使用することは避け、代わりに Redirect
を使用する必要があります。したがって、彼らによると、できればする必要があります:
<VirtualHost *:80>
ServerName www.example.com
Redirect / https://www.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>
Redirect
の後の最初の/
はURLで、2番目の部分はリダイレクト先です。
それを使用して、URLをサブドメインにリダイレクトすることもできます:Redirect /one/ http://one.example.com/
これは、不要なリダイレクトも省略する完全な方法です;)
*:80 VirtualHostエントリのRewriteRuleは条件を必要としないため、これらのルールは.htaccessファイルで使用することを目的としています。
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/(.*) https://%{HTTP_Host}/$1 [NC,R=301,L]
予想:
RewriteEngine on
==>エンジンをすべて有効にします
RewriteCond %{HTTPS} off [OR]
==> non-https接続で一致、または([OR]を設定しないと暗黙のANDが発生します!)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
==>転送された接続(プロキシ、ロードバランサーなど)で一致なし https
RewriteRule ^/(.*) https://%{HTTP_Host}/$1 [NC,R=301,L]
==>両方の条件のいずれかが一致する場合、URL全体の書き換えを行い、301を送信して、クライアントがこれを「学習」させ(一部は一致、一部は一致しない)、最後のルールのLを送信します。