htaccess redirige todas las URL con el parámetro de signo de interrogación a sin

htaccess redirige todas las URL con el parámetro de signo de interrogación a sin

Revisé mucho para mi pregunta. Hay algunos cercanos, pero ninguno que solucione mi problema.

Necesito redirigir permanentemente TODAS las URL que terminen en esto:

?mode=list

Y

?mode=grid

hasta sin (elimine el signo de interrogación y lo que sigue)

Ejemplo:

example.com/random-url-here?mode=grid redirect to example.com/random-url-here

Y

example.com/whatever-url-here?mode=list redirect to example.com/random-url-here

Probé esto:

RewriteEngine on 
RewriteRule (.*)$^mode=list $1
RewriteRule (.*)$^mode=grid $1

y esto

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

Pero no funciona. Claramente, no entiendo cómo funciona esto. Por favor ayuda.

Gracias

Respuesta1

example.com/random-url-here?mode=grid

La parte de la URL después de la primera ?(es decir, mode=griden este ejemplo) se llamacadena de consulta.

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

La RewriteRuledirectiva toma hasta 3 argumentos:

RewriteRule pattern substitution [flags]

Elpatrón(primer argumento) de la RewriteRuledirectiva es una expresión regular (regex) que coincide con la solicitadaSolo ruta URL, que excluye notablemente la cadena de consulta. Por lo tanto, no puede hacer coincidir la cadena de consulta utilizando la RewriteRuledirectiva.

Para hacer coincidir la cadena de consulta, debe utilizar una RewriteConddirectiva adicional (condición) y compararla con la QUERY_STRINGvariable del servidor. RewriteCondse aplican directivascondicionesa la RewriteRuledirectiva que sigue.

Sin embargo, la expresión regular (.*)$^mode=list(aparte de intentar hacer coincidir la cadena de consulta)nuncacoincidir en este contexto. $afirma el final de la línea y ^afirma el inicio de la línea, por lo que esto siempre fallará.

En el ejemplo anterior, la $1referencia inversa (en elcadena de sustitución) está intentando hacer coincidir la ruta URL. Sin embargo, esta ruta URL (en undirectoriocontexto, es decir. .htaccess) no comienza con una barra (es decir, esrelativo), por lo que se producirá una redirección con formato incorrecto a menos que también tenga una RewriteBasedirectiva definida en otra parte de su .htaccessarchivo. ArelativoLa cadena de sustitución se ve como una ruta del sistema de archivos relativa al directorio que contiene el .htaccessarchivo.

Si omite el indicador R( redirect) en este contexto (como en el primer ejemplo), intentará reescribir la solicitud internamente (no redirigir externamente), por lo que la URL visible no cambiará.

Pruebe lo siguiente, cerca de la parte superior de su .htaccessarchivo raíz:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^mode=(list|grid)$
RewriteRule (.*) /$1 [QSD,R=302,L]

Lo anterior establece... para todas las URL (.*)que tienen una cadena de consulta de mode=listo mode=grid(exactamente) luego redireccionan a la misma ruta URL y descartan la cadena de consulta ( QSD- Query String Discard). Es QSDnuevo en Apache 2.4 (que supongo que estás usando). Si omite la QSDbandera, obtendrá un bucle de redireccionamiento (ya que la cadena de consulta se volverá a agregar a la URL redirigida).

Tenga en cuenta que lo anterior coincide con la cadena de consulta.exactamente(como en sus ejemplos). Si hay otros parámetros de URL en la cadena de consulta o el caso es diferente, no coincidirá.

Tenga en cuenta que se trata de una redirección 302 (temporal). Solo cámbielo a 301 (permanente), si esa es la intención, cuando haya confirmado que funciona bien. Los 301 se almacenan en caché de forma persistente en el navegador, por lo que las pruebas pueden resultar problemáticas.

Referencia:

información relacionada