2012-07-23 28 views
53

私のApacheサーバーでは、すべての着信HTTPリクエストを同等のhttpsリクエストにリダイレクトできます。キャッチは、私がServerNameを指定せずにデフォルトの仮想ホストに対してこれを行うことができ、リクエストURLにどのようなサーバ名でもリダイレクトが動作するようにしたいということです。デフォルトの仮想ホストでServerNameなしのHTTPからHTTPSへリダイレクト

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

Redirectを使用して、このことは可能ですか私はRewriteに頼る必要があります:私はこのような何かを望んでいますか?あなたのバーチャルホストの設定でこれを追加すること

答えて

80

てみてくださいは:

RewriteEngine On 
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] 
+0

。 ubuntuまたはdebianベースのホストの場合、次のように動作します: 'sudo a2enmod rewrite'は、configtest/apache2の設定エラーを止めます。 (上記で提供されたvhostの追加を使用する場合、在庫設定は受け取るでしょう) –

+0

これはメインドメイン(例えば 'http:// mywebiste.com' - >' https:// mywebiste.com')に対してのみ機能しますwhat if私もサブドメイン( 'http://blog.mywebiste.com'->' https:// blog.mywebiste.com')ですか? – EsseTi

+7

** RewriteEngine On **の後に** RewriteCond%{HTTPS}をオフにしなければならないかもしれません**そうでないと、** ERR_TOO_MANY_REDIRECTS ** – Max

27

これは、あまりにも、不要なリダイレクトを省略するための完全な方法です;)

これらのルールは、以下のように、.htaccessファイルで使用されることを意図しています*:80 VirtualHostエントリのRewriteRuleには条件は必要ありません。

RewriteEngine on 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] 

Eplanations

RewriteEngine on 

==>すべて

RewriteCond %{HTTPS} off [OR] 

==>非HTTPS接続の一致、または([設定しないでエンジンを有効にしますOR]暗黙のANDを引き起こします!)

RewriteCond %{HTTP:X-Forwarded-Proto} !https 

==> HTTPS

RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] 

==ずに転送接続(プロキシ、ロードバランサなど)に試合>両方の条件が一致するのは、送信、全体のURLの書き換えを行う場合301によって、これがクライアントによって「学習された」(最後にはLがあっても、そうでないこともあれば)、最後にはLがあります。

+0

別の問題は、あなたの 'RewriteRule'はおそらく決して一致しません。あなたはスラッシュを削除したいと確信しています: 'RewriteRule ^(。*)...' –

+0

かなり確かに私はしません。あなたは 'L'フラグを含むターゲットの/構文を見逃しました。もう1つの方法はJon Linのようにやっています。 –

+6

この場合、RewriteCondは完全に不要です。 VirtualHostはすでに ''として定義されているので、最初は '%{SERVER_PORT} 'が443になることはないので、条件は常に一致します。 –

63

どちらも問題ありません。しかし、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であることがリダイレクトされるべきところ、第二の部分はあります。

あなたはまた、サブドメインにURLをリダイレクトするためにそれを使用することができます:あなたはmod_rewriteのを追加する必要があります* Redirect /one/ http://one.example.com/

+1

これは、更新された最新の回答のようです。 +1 –

+23

これは答えません**質問のServerName **部分を指定せずに –

関連する問題