あなたは間違いなくPHPでこれを行うべきです。これは機能するソリューションですが、URLのダッシュごとにRewriteRuleを1回通過する必要があるため、お勧めしません。しかし、関係なく:
RewriteEngine On
RewriteRule ^(.*)-(.*)$ $1_$2 [QSA]
ここで何が起こるかを明確にするために、リクエストがの場合、パスごとに1つのダッシュしか置き換えることができないため、は複数回実行されますhttp://www.example.com/argument-1/argument-2/argument-3。RewriteRuleしたがって、URLは次のように変換されます。
パス1:http://www.example.com/argument-1/argument-2/argument_3
パス2:http://www.example.com/argument-1/argument_2/argument_3
パス3:http://www.example.com/argument_1/argument_2/argument_3
$1とについては$2、これらは正規表現の括弧で囲まれたコンポーネントを参照しています。正規表現^(.*)-(.*)$、、は次のように分類されます。
^-URIの先頭に一致します
(.*)-任意の数の文字を一致(およびキャプチャ)します。これは$1置き換えになります
--ダッシュに一致
(.*)-任意の数の文字を一致(およびキャプチャ)します。これは$2置き換えになります
$-URIの末尾に一致します
したがって、最初のパススルーは、に$1なります。次に、置換により2つの間にアンダースコアが挿入され、新しいURIが作成されます。/argument-1/argument-2/argument$23
/argument-1/argument-2/argument_3
次に、正規表現がまだ新しいURIと一致し(が含まれているため-)、$1is/argument-1/argumentと$2isであるため、再度実行され2/argument_3ます。次に、置換により2つの間にアンダースコアが挿入され、新しいURIが作成されます。
/argument-1/argument_2/argument_3
次に、正規表現がまだ新しいURIと一致し(が含まれているため-)、$1is/argumentと$2isであるため、再度実行され1/argument_2/argument_3ます。次に、置換により2つの間にアンダースコアが挿入され、新しいURIが作成されます。
/argument_1/argument_2/argument_3
次に、正規表現が一致しなくなったため、ApacheはこのURIを続行します(ダッシュがなくなったため)。