メインコンテンツまでスキップ

ケース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/helloexample.com/hello?layout=desktop&にリダイレクトし、URLの末尾に不要な&が含まれるためです。通常は大きな問題ではありませんが、削除したい場合は「キャプチャグループ処理」を使用できます。

結論として、最終的な出力は次のとおりです。

  • リダイレクト元: (https://example.com/[^?]*)((\(.*))?) (正規表現)
  • リダイレクト先: $1?layout=desktop$3
  • 除外URLパターン: .*[&?]layout=[^&]*.* (正規表現)
  • キャプチャグループ処理:
    • グループ: $3
    • 処理: 出現箇所の置換
      • ターゲット: \?(.*)
      • 置換: &$1

⬇️ ルールをダウンロード

これは単なる例です。各問題を処理するために複数のルールを作成することもできます。その方がはるかにシンプルになる可能性があります。