mod_rewrite 「/(スラッシュ)」が減る
mod_rewrite で以下のように設定した時、「//(ダブルスラッシュ)」が「/(スラッシュ)」になってしまいました。
リンクURL :
http://fya.jp/sample/http://www.fya.jp/
RewriteRule ^sample/(.*)$ sample\.cgi?url=$1 [L]
結果 :
http://fya.jp/sample.cgi?url=http:/www.fya.jp/
Apache 2.2 + mod_rewrite 問題発生。
Apache 1.3 + mod_rewrite 正常。
Apache 2.2 の仕様みたいです。
連続する「/(スラッシュ)」は一つへ勝手に修正してから mod_rewrite で処理がされる。
根本的な回避策は見当たらないのでスクリプト(例 : sample.cgi)を修正することで対応しました。
$url =~ s/:\/\//:\//g;
$url =~ s/:\//:\/\//g;
念のために http と https を意識しました。
処理の流れとしては「://」を「:/」へ置き換えしてから「:/」を「://」に置き換えるというものです。
こちらは上記方法を少し掘り下げて正規表現を盛り込んだ修正例です。
$url =~ s|^https?:/(?!/)|$&/|;
処理の流れは「http:/」か「https:/」がある時、「http://」あるいは「https://」に置き換えるというものです。
最初から「http://」や「https://」だった場合は置き換えはしません。
どちらも基本的には同じ結果ですが、前者は二行になります。
後者はgオプションが無いので一箇所置き換えるだけです。
複数箇所を置き換える場合はgオプションを付加してください。