ケース3:URLにクエリパラメータを追加する
デフォルトでモバイルレイアウトを表示するexample.com
というウェブサイトがあり、デスクトップレイアウトを好むとします。幸いなことに、そのウェブサイトはlayout
クエリパラメータをサポートしており、表示するレイアウトを指定できます。layout=desktop
を自動的に追加するルールを作成しましょう。
次のように定義できると考えるかもしれません。
- リダイレクト元:
https://example.com/.*
(正規表現) - リダイレクト先:
$0?layout=desktop
$0
はターゲットURLを参照します。example.com/hello
にアクセスしようとすると、example.com/hello?layout=desktop
にリダイレクトされます。この機能は置換と呼ばれます。
ワイルドカードモードでも置換は利用可能です。これは内部的に正規表現に変換されるためです。
しかし、これらの設定にはいくつかの問題があります。
問題1:無限ループ
現在の設定では、https://example.com/.*
がhttps://example.com/hello?layout=desktop
もターゲットにするため、無限リダイレクトループが発生します。
この場合、次のように正規表現を使用して、リダイレクトなしでアクセスできる除外URLパターンを指定できます。
.*[&?]layout=[^&]*.*
.*
: 何でも一致[&?]
:&
または?
のいずれかに一致[^&]*
:&
以外の何でも一致
問題2:既存のパラメータを適切に処理できない
ターゲットURLにexample.com/hello?theme=dark
のような他のクエリパラメータがすでに存在する場合、宛先はexample.com/hello?theme=dark?layout=desktop
(URLに?
が2つあります)になりますが、パラメータは&
でのみ結合できます。?
はパラメータの先頭でのみ許可される特殊文字です。したがって、有効なパラメータとして扱われません。
この場合、設定を次のように変更します。
- リダイレクト元:
(https://example.com/[^?]*)(\(.*))?
- リダイレクト先:
$1?layout=desktop&$3
ステップバイステップで見ていきましょう。
(https://example.com/[^?]*)
:?
の前の文字までの部分に一致します。[^?]*
は?
以外の何でも一致します。- これは
()
で囲まれているため、後で$1
で参照できます。
(\(.*))?
:?
で始まる文字列、つまりクエリパラメータに一致します。- これは、パターンの末尾にある
?
量指定子(0回または1回一致)によって空文字列にも一致します。 - 外側の
()
と内側の()
は、後で$2
と$3
で参照できます。
- これは、パターンの末尾にある
RegExrが詳細を理解するのに役立つかもしれません。
RegExrは、/
を\
でエスケープしないとエラーを表示します。エスケープすることはできますが、Redirect WebはApple製の異なるエンジンを使用しており、エスケープを必要としないため、必須ではありません。
これは完璧な解決策ではありません。example.com/hello
をexample.com/hello?layout=desktop&
にリダイレクトし、URLの末尾に不要な&
が含まれるためです。通常は大きな問題ではありませんが、削除したい場合は「キャプチャグループ処理」を使用できます。
結論として、最終的な出力は次のとおりです。
- リダイレクト元:
(https://example.com/[^?]*)((\(.*))?)
(正規表現) - リダイレクト先:
$1?layout=desktop$3
- 除外URLパターン:
.*[&?]layout=[^&]*.*
(正規表現) - キャプチャグループ処理:
- グループ:
$3
- 処理: 出現箇所の置換
- ターゲット:
\?(.*)
- 置換:
&$1
- ターゲット:
- グループ:
これは単なる例です。各問題を処理するために複数のルールを作成することもできます。その方がはるかにシンプルになる可能性があります。