Pular para o conteúdo principal

Caso 3: Adicionar parâmetros de consulta à URL

Digamos que existe um site chamado example.com que mostra um layout móvel por padrão, mas você prefere o layout de desktop. Felizmente, o site suporta um parâmetro de consulta layout para especificar qual layout o site exibe. Vamos criar uma regra que adicione layout=desktop automaticamente.

Talvez você pense que poderia defini-lo da seguinte forma:

  • Redirecionar De: https://example.com/.* (Expressão Regular)
  • Redirecionar Para: $0?layout=desktop

$0 referencia a URL de destino. Se você tentar acessar example.com/hello, você será redirecionado para example.com/hello?layout=desktop. Este recurso é chamado de substituição.

dica

A substituição também está disponível para o modo Curinga, pois é convertida internamente para Expressão Regular.

No entanto, existem alguns problemas com essas configurações.

Problema 1: Loop infinito

A configuração atual cria um loop de redirecionamento infinito, pois https://example.com/.* também direciona para https://example.com/hello?layout=desktop.

Neste caso, você pode especificar um padrão de URL excluído que permite o acesso sem redirecionamento, como este com Expressão Regular:

.*[&?]layout=[^&]*.*
  • .*: Corresponde a qualquer coisa
  • [&?]: Corresponde a & ou ?
  • [^&]*: Corresponde a qualquer coisa, exceto &

Problema 2: Não consegue lidar com parâmetros existentes corretamente

Se a URL de destino já tiver outros parâmetros de consulta como example.com/hello?theme=dark, o destino será example.com/hello?theme=dark?layout=desktop (Existem dois ? na URL), mas você só pode unir os parâmetros com &. ? como um caractere especial só é permitido no início dos parâmetros. Portanto, não é tratado como um parâmetro válido.

Neste caso, altere as configurações assim:

  • Redirecionar De: (https://example.com/[^?]*)(\(.*))?
  • Redirecionar Para: $1?layout=desktop&$3

Vamos analisar passo a passo.

  • (https://example.com/[^?]*): Corresponde à parte até o caractere anterior de ?.
    • [^?]* corresponde a qualquer coisa, exceto ?.
    • Isso é envolvido com () para que você possa referenciá-lo com $1 mais tarde.
  • (\(.*))?: Corresponde a uma string que começa com ?, o que significa parâmetros de consulta.
    • Isso também corresponde a uma string vazia pelo quantificador ? no final do padrão, que corresponde zero ou uma vez.
    • O () externo e o () interno podem ser referenciados com $2 e $3 mais tarde.

RegExr pode ajudá-lo a entender os detalhes.

observação

O RegExr mostra um erro quando você não escapa / com \. Embora você possa escapá-lo, não é necessário, pois o Redirect Web usa um mecanismo diferente da Apple que não exige escape.

Esta não é uma solução perfeita, pois redireciona example.com/hello para example.com/hello?layout=desktop&, que inclui um & desnecessário no final da URL. Não é um grande problema em geral, mas se você deseja removê-lo, pode usar o Processamento de Grupo de Captura.

Em conclusão, esta é a saída final:

  • Redirecionar De: (https://example.com/[^?]*)((\(.*))?) (Expressão Regular)
  • Redirecionar Para: $1?layout=desktop$3
  • Padrão de URL Excluído: .*[&?]layout=[^&]*.* (Expressão Regular)
  • Processamento de Grupo de Captura:
    • Grupo: $3
    • Processo: Substituir Ocorrências
      • Alvo: \?(.*)
      • Substituição: &$1

⬇️ Baixar a Regra

Este é apenas um exemplo. Você também pode criar várias regras para lidar com cada problema. Pode ser muito mais simples.