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=grid
en este ejemplo) se llamacadena de consulta.
RewriteRule (.*)$^mode=list $1 [L,R=301]
La RewriteRule
directiva toma hasta 3 argumentos:
RewriteRule pattern substitution [flags]
Elpatrón(primer argumento) de la RewriteRule
directiva 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 RewriteRule
directiva.
Para hacer coincidir la cadena de consulta, debe utilizar una RewriteCond
directiva adicional (condición) y compararla con la QUERY_STRING
variable del servidor. RewriteCond
se aplican directivascondicionesa la RewriteRule
directiva 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 $1
referencia 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 RewriteBase
directiva definida en otra parte de su .htaccess
archivo. ArelativoLa cadena de sustitución se ve como una ruta del sistema de archivos relativa al directorio que contiene el .htaccess
archivo.
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 .htaccess
archivo 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=list
o mode=grid
(exactamente) luego redireccionan a la misma ruta URL y descartan la cadena de consulta ( QSD
- Query String Discard). Es QSD
nuevo en Apache 2.4 (que supongo que estás usando). Si omite la QSD
bandera, 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: