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.
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.
- Isso também corresponde a uma string vazia pelo quantificador
RegExr pode ajudá-lo a entender os detalhes.
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
- Alvo:
- Grupo:
Este é apenas um exemplo. Você também pode criar várias regras para lidar com cada problema. Pode ser muito mais simples.