古き良き正規表現は私を夢中にさせています。
mod_alias からのリダイレクト (mod_rewrite は使用できません) を使用して、"/bt/sub/[a_few_endings]" を除いて、Apache 2.4 のすべてのトラフィックを HTTP から HTTPS にリダイレクトする必要があります。
私が知っているすべてのオンライン テスター (例: http://regex101.com/ ) で次の正規表現をテストしたところ、一致させたくない URL を除いて、正規表現が実際にすべてに一致する必要があることがすべて確認されました。
^/(?!bt/sub/(went_active|success|cancel|expired)).*$
私が知る限り、これは http://local.mysite.com のすべてに一致し、次の 4 つを除いてhttps://local.mysite.comにリダイレクトする必要があります。
- http://local.mysite.com/bt/sub/went_active
- http://local.mysite.com/bt/sub/success
- http://local.mysite.com/bt/sub/cancel
- http://local.mysite.com/bt/sub/expired
それでも、Apache はリダイレクトしたくない上記の URL を含め、すべてをリダイレクトします。
私は SO でいくつかの同様の質問を見つけましたが、それらのほとんどは mod_rewrite に照らして回答されています。これは私が望んでいる/必要としているものではありません。
現在の仮想ホスト構成は次のとおりです。
<VirtualHost *:80>
ServerName local.mysite.com
RedirectMatch 302 ^/(?!bt/sub/(went_active|success|cancel|expired)).*$ https://local.mysite.com
DocumentRoot /home/borfast/projects/www/mysite/public
#Header set Access-Control-Allow-Origin *
SetEnv LARAVEL_ENV localdev
<Directory /home/borfast/projects/www/mysite/public/>
Options All
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
私が夢中にならないように助けてください:)
更新: 何か奇妙なことが起こっています: 明らかに、要求された URL/パスが見つかると、Apache は RedirectMatch の式を無視し、RedirectMatch がそうしないように指示しているにもかかわらず、クライアントをリダイレクトします。
これをテストするために、Ubuntu Trussty 64 を新たにインストールし、Apache 2.4 をロードした別の VM 内に新しい仮想ホストをゼロから作成しました。この新しい仮想ホストには、次のように、ServerName、RedirectMatch、および DocumentRoot ディレクティブのみが含まれていました。
<VirtualHost *:80>
ServerName testing.com
RedirectMatch 302 ^/(?!bt/sub/(went_active|success)$).*$ https://othersite.com/
DocumentRoot /home/vagrant/www
</VirtualHost>
ディレクトリ/home/vagrant/www/bt/sub/went_active
を作成して、Apache が 2 つの可能な URL のうち少なくとも 1 つにアクセスできるようにしました。にアクセスしようとするとhttp://testing.com:8080
、期待どおりにリダイレクトされます。
次に、奇妙なことhttp://testing.com:8080/bt/sub/went_active
に、作成したディレクトリに一致する URL にアクセスすると、リダイレクトされるべきではないにもかかわらず、リダイレクトされますが、にアクセスするhttp://testing.com:8080/bt/sub/success
と、リダイレクトされず、代わりに 403 Forbidden が表示されます。
私はこれで正気を失っているかもしれませんが、Apache が要求を処理できることを確認し、リダイレクトを防止する RedirectMatch の正規表現と一致すると、正規表現を無視してとにかくリダイレクトを実行することを決定するようです。これを表す 3 文字: WTF?!?!?!