Eu verifiquei muito, para minha pergunta. existem alguns próximos, mas nenhum que resolveria meu problema.
Preciso redirecionar permanentemente TODOS os URLs que terminam assim:
?mode=list
E
?mode=grid
para sem (remova o ponto de interrogação e o que vem depois dele)
Exemplo:
example.com/random-url-here?mode=grid redirect to example.com/random-url-here
E
example.com/whatever-url-here?mode=list redirect to example.com/random-url-here
Eu tentei isso:
RewriteEngine on
RewriteRule (.*)$^mode=list $1
RewriteRule (.*)$^mode=grid $1
e isto
RewriteEngine on
RewriteRule (.*)$^mode=list $1 [L,R=301]
RewriteRule (.*)$^mode=grid $1 [L,R=301]
Mas não funciona. Claramente, não entendo como isso funciona. Por favor ajude.
Obrigado
Responder1
example.com/random-url-here?mode=grid
A parte do URL após a primeira ?
(ou seja, mode=grid
neste exemplo) é chamada destring de consulta.
RewriteRule (.*)$^mode=list $1 [L,R=301]
A RewriteRule
diretiva leva até 3 argumentos:
RewriteRule pattern substitution [flags]
Opadrão(primeiro argumento) da RewriteRule
diretiva é uma expressão regular (regex) que corresponde ao solicitadoSomente caminho de URL, o que exclui notavelmente a string de consulta. Portanto, você não pode corresponder a string de consulta usando a RewriteRule
diretiva.
Para corresponder à string de consulta, você precisa usar uma RewriteCond
diretiva adicional (condição) e verificar a QUERY_STRING
variável do servidor. RewriteCond
diretivas se aplicamcondiçõesà RewriteRule
directiva que se segue.
No entanto, o regex (.*)$^mode=list
(além de tentar corresponder à string de consulta) iránuncacombinar neste contexto. $
afirma o fim da linha e ^
o início da linha - portanto, isso sempre falhará.
No seu exemplo acima, a $1
referência anterior (nostring de substituição) está tentando corresponder ao caminho da URL. No entanto, este caminho de URL (em umdiretóriocontexto, ou seja. .htaccess
) não começa com uma barra (ou seja, érelativo), isso resultará em um redirecionamento malformado, a menos que você também tenha uma RewriteBase
diretiva definida em outro lugar do seu .htaccess
arquivo. Arelativoa string de substituição é vista como um caminho do sistema de arquivos relativo ao diretório que contém o .htaccess
arquivo.
Se você omitir o sinalizador R
( redirect
) neste contexto (como no seu primeiro exemplo), ele tentará reescrever internamente a solicitação (não redirecionar externamente), para que o URL visível não seja alterado.
Em vez disso, tente o seguinte, próximo ao topo do seu .htaccess
arquivo raiz:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^mode=(list|grid)$
RewriteRule (.*) /$1 [QSD,R=302,L]
Os estados acima... para todos os URLs (.*)
que possuem uma string de consulta mode=list
ou mode=grid
(exatamente) redirecionam para o mesmo caminho de URL e descartam a string de consulta ( QSD
- Query String Discard). O QSD
é novo no Apache 2.4 (que presumo que você esteja usando). Se você omitir o QSD
sinalizador, obterá um loop de redirecionamento (já que a string de consulta será reanexada ao URL redirecionado).
Observe que o texto acima corresponde à string de consultaexatamente(como em seus exemplos). Se houver outros parâmetros de URL na string de consulta ou se o caso for diferente, a correspondência não será possível.
Observe que este é um redirecionamento 302 (temporário). Só mude para 301 (permanente) - se essa for a intenção - quando tiver confirmado que funciona bem. Os 301s são armazenados em cache persistentemente pelo navegador, o que pode tornar os testes problemáticos.
Referência: