0

この構造で結果のリストを返すためにurl引数を取るCMSがあります:

website.com/argument_1/argument_2。

サイトが結果を返すためには、引数にアンダースコアが必要です。

ただし、url構造に対して生成されるコードは次のとおりです。

website.com/argument-1/argument-2。このURL構造を維持する必要がありますが、誰かがリンクをクリックすると、下線付きのapacheを介してPHPに渡される必要があります。

それが理にかなっていることを願っています。これは.htaccessと書き換えルールで行われますか?私はこれまでそのようなことを書いたことがないので、助けていただければ幸いです。ありがとう

4

1 に答える 1

1

あなたは間違いなくPHPでこれを行うべきです。これは機能するソリューションですが、URLのダッシュごとにRewriteRuleを1回通過する必要があるため、お勧めしません。しかし、関係なく:

RewriteEngine On
RewriteRule ^(.*)-(.*)$ $1_$2 [QSA]

ここで何が起こるかを明確にするために、リクエストがの場合、パスごとに1つのダッシュしか置き換えることができないため、は複数回実行されますhttp://www.example.com/argument-1/argument-2/argument-3RewriteRuleしたがって、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を続行します(ダッシュがなくなったため)。

于 2012-06-22T18:36:20.617 に答える