htaccess redireciona todos os URLs com parâmetro de ponto de interrogação para sem

htaccess redireciona todos os URLs com parâmetro de ponto de interrogação para sem

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=gridneste exemplo) é chamada destring de consulta.

RewriteRule (.*)$^mode=list $1 [L,R=301]

A RewriteRulediretiva leva até 3 argumentos:

RewriteRule pattern substitution [flags]

Opadrão(primeiro argumento) da RewriteRulediretiva é 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 RewriteRulediretiva.

Para corresponder à string de consulta, você precisa usar uma RewriteConddiretiva adicional (condição) e verificar a QUERY_STRINGvariável do servidor. RewriteConddiretivas se aplicamcondiçõesà RewriteRuledirectiva 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 $1referê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 RewriteBasediretiva definida em outro lugar do seu .htaccessarquivo. Arelativoa string de substituição é vista como um caminho do sistema de arquivos relativo ao diretório que contém o .htaccessarquivo.

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 .htaccessarquivo 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=listou 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 QSDsinalizador, 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:

informação relacionada