あなたは間違いなく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
$2
3
/argument-1/argument-2/argument_3
次に、正規表現がまだ新しいURIと一致し(が含まれているため-
)、$1
is/argument-1/argument
と$2
isであるため、再度実行され2/argument_3
ます。次に、置換により2つの間にアンダースコアが挿入され、新しいURIが作成されます。
/argument-1/argument_2/argument_3
次に、正規表現がまだ新しいURIと一致し(が含まれているため-
)、$1
is/argument
と$2
isであるため、再度実行され1/argument_2/argument_3
ます。次に、置換により2つの間にアンダースコアが挿入され、新しいURIが作成されます。
/argument_1/argument_2/argument_3
次に、正規表現が一致しなくなったため、ApacheはこのURIを続行します(ダッシュがなくなったため)。