ケース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
- ターゲット:
- グループ:
これは単なる例です。各問題を処理するために複数のルールを作成することもできます。その方がはるかにシンプルになる可能性があります。