次のリダイレクトを構成しました。
<VirtualHost ...>
<Directory ...>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(myapp/login) https://%{HTTP_HOST}:443/$1 [NC,R=301,L]
しかし、それはリダイレクトされません。どうすればトラブルシューティングできますか?
一般的なデバッグ: Apache 構成自体にアクセスできる場合は、RewriteLog
設定したレベルに応じて、一致、現在の値、および変更の段階的な内訳を表示できる を有効にすることができます。
ここで起こっていることは、host
コンテキスト全体 (apache の構成ファイルでのみ利用可能) または.htaccess
コンテキストのディレクトリごとに一致する URL に違いがあるということです:
何が一致していますか?VirtualHost
コンテキストで は、パターンは最初にURL のホスト名とポートの後、クエリ文字列の前の部分と照合されます (例: "/app1/index.html")。Directory and htaccess context では、パターンは最初に、サーバーを現在の RewriteRule に導くプレフィックスを削除した後、ファイルシステム パスと照合されます (ディレクティブの場所に応じて、"app1/index.html" または "index.html" など)。定義されています)。
この 2 つの違いは、あるVirtualHost
コンテキストでは先頭/
の があり、.htcaccess
そのコンテキストでは (ネット上のほとんどの例では、より簡単に利用できるため、これを前提としています)、その先頭の がないことです/
。
要するに、ここではこれは機能しますが、では機能しません.htaccess
:
^/(myapp/login)
両方のコンテキストで一致させたい場合は、先頭を/
オプションにします。
^/?(myapp/login)
私にとっては、次のコードが機能しました(これは != (@jasonが言ったように)とポートの組み合わせに関係していると思います.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(myapp/login) https://%{HTTP_HOST}/$1 [R=301,L,NC]
辞書式等価演算子の否定には問題があると思います。mod_rewrite のドキュメントや他の場所でこれを禁止するものは見つかりませんでしたが、!=
. 実際、ドキュメントはそれが機能することを示していますが、次のように「オンではない」ではなく「オフ」に一致するようにしてみてください。
RewriteCond %{HTTPS} off
この場合、通常の方法 (例: を使用RewriteLog
) を使用してトラブルシューティングを行うことは非常に困難です。