web-dev-qa-db-ja.com

ServerNameを使用せずにデフォルトの仮想ホストでHTTPをHTTPSにリダイレクトする

Apacheサーバーで、すべての着信http要求を同等のhttps要求にリダイレクトできるようにしたいと思います。キャッチは、ServerNameを指定せずにデフォルトの仮想ホストでこれを実行し、リクエストURLに表示されたサーバー名でリダイレクトが機能するようにすることです。私はこのようなものを望んでいます:

NameVirtualHost *:80
<VirtualHost *:80>
    RedirectPermanent / https://%{SERVER_NAME}/
    ...
</VirtualHost>

これはRedirectを使用して可能ですか、またはRewriteに頼らなければなりませんか?

66

これを仮想ホスト設定に追加してみてください:

RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_Host}$1 [R=301,L]
97
Jon Lin

両方ともうまくいきます。しかし 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/

82
orszaczky

これは、不要なリダイレクトも省略する完全な方法です;)

*: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を送信します。

35
Jimmy Koerting