web-dev-qa-db-ja.com

デフォルトでApacheのmod_rewriteをHTTPS経由でリダイレクトさせる方法は?

HTTPS経由で利用できるウェブサイトがあるとしましょう。 https://example.com/foo。次の.htaccessを検討してください。

RewriteBase /
RewriteEngine On
RewriteRule ^foo$ bar [R=301,L]

さて、https://example.com/fooにアクセスすると、HTTPSではなくHTTP経由でhttp://example.com/barにリダイレクトされます。

RewriteRuleフラグを使用してすべてのRに完全なスキーム+ホストを使用する以外に、HTTPSに移行するにはどうすればよいですか?つまり、これは私が求めていることを実行します。

RewriteBase /
RewriteEngine On
RewriteRule ^foo$ https://example.com/bar [R=301,L]

しかし、私の.htaccessファイルにはそのようなRewriteRulesがたくさん含まれており、Apache/mod_rewriteに「デフォルトでhttps://に書き換える」ように指示する方法があるはずだと感じています。私が本当に探しているのは、ServerName foo.extを介してホスト名を宣言する方法と同様に、サイトがHTTPSを使用していることをApacheに通知するディレクティブです。それは可能ですか?

これはStackOverflowに関する同様の質問だと思います: Apacheに元のクライアントプロトコルを納得させる方法

1
Mathias Bynens

ServerName スキームも受け入れます。例: ServerName https://example.com。構成でこれを変更し、Apacheを再起動するとうまくいきました。

から ドキュメント

サーバーは、リバースプロキシ、ロードバランサー、SSLオフロードアプライアンスなど、SSLを処理するデバイスの背後で実行される場合があります。この場合は、https://スキームとクライアントが接続するポート番号をServerNameディレクティブで指定して、サーバーが正しい自己参照URLを生成するようにします。

3
Mathias Bynens

これはそれを行う方法です:

RewriteEngine On

#redirect all your http trafic to https exept /foo & /bar
RewriteCond %{HTTP_Host} ^example.com
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !(/foo|/bar)
RewriteRule (.*) https://example.com$1 [R=301,L]

#redirect /foo trafic to /bar
RewriteCond %{HTTP_Host} ^example.com
RewriteCond %{REQUEST_URI} /foo
RewriteRule /foo(.*) http://example.com/bar$1 [R=301,L]

これをhttpd.confに入れるか、すべての仮想ホストの前に置くと、example.comで始まるすべてのリクエストに適用されます(www.example.comはリダイレクトされません)

ルールをすべてのドメインに適用するには、行RewriteCond %{HTTP_Host} ^example.comを削除します。

詳細については、無駄なハードディスクアクセスを防ぐために、可能であれば.htaccessの使用を避ける必要があります。

1
Froggiz

プレーンなRewriteディレクティブを使用していない理由はありますか?

Rewrite / https://example.com/

サブドメインの場合、次のことができます

Rewrite http://foo.example.com https://foo.example.com
0
Felix Jen