web-dev-qa-db-ja.com

301([a-z] +)-(。*)および([0-9] +)-(。*)の意味をリダイレクトします

いくつかのカスタムリダイレクトで.htaccessファイルをチェックしました。完全には理解していない2つのリダイレクトがあります。

_RedirectMatch 301 ^/news/([0-9]+)-(.*) /blog
RedirectMatch 301 ^/news/([a-z]+)-(.*)/$ /blog/$1
_

どちらのリダイレクトもnewsディレクトリ内のサブフォルダーまたはページをリダイレクトしていますが、[0-9]+)-(.*)および_([a-z]+)-(.*)_の部分が理解できないため、方法を完全に把握できません。彼らは正確にはどういう意味ですか?

4
Peesen87

混乱しているパターンは 正規表現 関数にすぎません。 ([0-9]+)-(.*)および([a-z]+)-(.*)パターンには、それぞれ2つのグループがあります。正規表現のグループは、()内で何かとして分類されます。次に、グループのコンテンツは、指定された基準に従って照合されます。

  1. グループ([0-9]+)の基準は、1つまたは複数の数値に一致することです。これにはアルファベットや特殊文字は含まれません
  2. グループ([a-z]+)の基準は、1つまたは複数の小文字に一致することです。これには、スペース、数字、大文字などは含まれません。
  3. グループ(.*)では、アルファベット、数字、特殊文字などに関係なく、すべての文字に一致することが基準です。

.htaccessで次のことが起こっています:

  1. RedirectMatch 301 ^/news/([0-9]+)-(.*) /blog
  2. RedirectMatch 301 ^/news/([a-z]+)-(.*)/$ /blog/$1

ステートメント1では、パターン^/news/([0-9]+)-(.*)は、URLがexample.com/news/23-articleの場合に一致し、単にexample.com/blogにリダイレクトされます。

ステートメント2では、パターン^/news/([a-z]+)-(.*)/$は、URLがexample.com/news/latest-article/である場合に一致し、example.com/blog/latestにリダイレクトされます。

ステートメント2の宛先URLの$1に注意してください。$ 1は、一致したグループ1のコンテンツをフェッチするために使用されます。したがって、最初のグループのコンテンツはWord latestであるため、宛先URLは/blog/latestとして取得されます。

11
Shahzeb Qureshi

これらは正規表現(略して「正規表現」)です。具体的には、ApacheはPCRE(Perl互換正規表現)構文(PHPと同じ、JavaScriptと同様など)を使用します。

RedirectMatch 301 ^/news/([0-9]+)-(.*) /blog
RedirectMatch 301 ^/news/([a-z]+)-(.*)/$ /blog/$1

RedirectMatchディレクティブは、正規表現(2番目の引数)を要求されたURLパスと一致させようとします。一致する場合、リダイレクト応答が返され、ブラウザーをターゲットURLにリダイレクトします(3番目の引数)。

2番目の例のターゲットURLの$1backreferenceは、ソースURLパスで一致したテキストをコピーします。例えば。 /news/abc-123/へのリクエストが与えられると、abc部分は/blog/abcにリダイレクトするために「コピー」されます(後述)。

([0-9]+)-(.*)

これは基本的に、1つ以上の数字の後にハイフンが続く(その後に何でも続く)と一致します。具体的には:

  • [0-9]-この「文字クラス」([..]で示される)は、0〜9の範囲の単一の文字に一致します。数字。
  • +は「数量詞」であり、1つ以上の先行する文字/グループと一致します。したがって、1桁以上に一致します。
  • -このハイフンは文字通り一致します(文字クラスの外で使用する場合、特別な意味はありません)。
  • .*は、任意の数の文字に一致します(改行を除く)。具体的には、.は任意の文字(改行を除く)に一致し、*は0以上の先行する文字/グループに一致する数量詞です。 (1つ以上に一致する+と比較してください。)
  • 正規表現の一部を囲む括弧(..)は、「後方参照を使用して後で使用できる」「キャプチャグループ」を作成します。ただし、これらはここでは使用されていません。

上記は簡略化できます(後方参照が使用されないため)。 1桁以上の数字に続けてハイフンを付けるだけです。

\d+-

\dは、数字に一致する省略文字クラスです。すなわち。 [0-9]と同じです。

([a-z]+)-(.*)/$

上記と非常に似ていますが、1文字以上の小文字(a-z)、ハイフン、それに続く任意のスラッシュで終わる前に一致します。

  • $アンカーであり、文字列の終わりを示します。ここで使用する場合のURLパスの終わり。逆に、^は文字列の先頭に一致します。 URLパスの開始点(中間点とは対照的)。

最初の正規表現とは異なり、この例では最初の後方参照($1)が使用され、([a-z]+)に一致するものをすべてキャプチャします。したがって、たとえば、/news/abc-123//blog/abcにリダイレクトされます。

後方参照のキャプチャと末尾のスラッシュのため、これは最初の正規表現ほど単純化できません。ただし、括弧の2番目のグループは削除できます。

([a-z]+)-.*/$
7
MrWhite

RegEx Buddyなどのツールを使用して、すべての構文を覚えるのに十分ではないため、正規表現を使用しています。正規表現を視覚的に説明します。正規表現については次のとおりです。

^/news/([0-9]+)-(.*)

enter image description here

^/news/([a-z]+)-(.*)/$

enter image description here

3
Trebor