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
ファイルにはそのようなRewriteRule
sがたくさん含まれており、Apache/mod_rewriteに「デフォルトでhttps://
に書き換える」ように指示する方法があるはずだと感じています。私が本当に探しているのは、ServerName foo.ext
を介してホスト名を宣言する方法と同様に、サイトがHTTPSを使用していることをApacheに通知するディレクティブです。それは可能ですか?
これはStackOverflowに関する同様の質問だと思います: Apacheに元のクライアントプロトコルを納得させる方法
ServerName
スキームも受け入れます。例: ServerName https://example.com
。構成でこれを変更し、Apacheを再起動するとうまくいきました。
から ドキュメント :
サーバーは、リバースプロキシ、ロードバランサー、SSLオフロードアプライアンスなど、SSLを処理するデバイスの背後で実行される場合があります。この場合は、
https://
スキームとクライアントが接続するポート番号をServerName
ディレクティブで指定して、サーバーが正しい自己参照URLを生成するようにします。
これはそれを行う方法です:
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の使用を避ける必要があります。
プレーンなRewriteディレクティブを使用していない理由はありますか?
Rewrite / https://example.com/
サブドメインの場合、次のことができます
Rewrite http://foo.example.com https://foo.example.com