Redirigir todas las páginas excepto una a la página de inicio mediante .htaccess
Acabo de transformar un sitio web antiguo en una página única de WordPress.
El sitio web antiguo tenía varias URLs, ahora solo hay 1: la página de inicio. Además de otra página con la política de privacidad.
Por lo tanto, me gustaría redirigir todas las URLs excepto la que tiene el slug "privacy" a la página de inicio.
Esto es lo que estoy intentando, sin éxito:
#redirecciones personalizadas
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]
</IfModule>
# BEGIN WordPress (reglas htaccess estándar de wp)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Obtengo demasiadas redirecciones: todas las URLs se redirigen infinitamente a sí mismas, ¿por qué?
¿Sería mejor (si es posible) usar una regla de redirect en lugar de rewrite?
ACTUALIZACIÓN
Siguiendo las sugerencias de los comentarios, probé las siguientes redirecciones personalizadas (antes de las reglas estándar de WP):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/privacy-policy$
RewriteRule (.*) http://mywebsite.com/ [R=301,L]
</IfModule>
Pero sigue sin funcionar

Problemas
Recibo demasiadas redirecciones: todas las URLs se redirigen infinitamente a sí mismas, ¿por qué?
Las reglas de reescritura de Apache se procesan de arriba a abajo, por lo que tu regla personalizada siempre se procesa primero. La bandera de redirección R
indica a Apache que le diga al navegador que haga una nueva solicitud a la URL modificada en lugar de servir el destino de la reescritura en la dirección actual, y la bandera "última" L
le dice a Apache que ignore todas las reglas de reescritura siguientes. Por lo tanto, cada vez que se aplica tu RewriteRule
, se realiza una nueva solicitud y tus reglas se procesan nuevamente desde el principio.
Tu RewriteCond
indica a Apache que procese la siguiente RewriteRule
cuando la ruta del URI de solicitud no comience con /privacy-policy
, por lo que prácticamente cada solicitud resulta en una redirección antes de que se puedan evaluar las demás reglas en tu archivo .htaccess
.
Como mencionó @MarkKaplun en los comentarios, $1
es una referencia que se sustituye por la parte del URI coincidente contenida en el primer "grupo de captura" (el primer conjunto de paréntesis en el patrón). Dado que .*
coincide literalmente con cualquier número de caracteres, en tu RewriteRule
$1
se sustituye con todo el URI.
En esencia, tus reglas de reescritura:
RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]
se evalúan como "Si el URI no comienza con /privacy-policy/
, haz que el navegador envíe una nueva solicitud a http://www.mywebsite.com/(ruta URI original)
".
Por ejemplo, si navegas a http://www.mywebsite.com/blog/2015
, esto es lo que sucede con cada solicitud:
/blog/2015
no comienza con/privacy-policy/
, indicar al navegador que vaya ahttp://www.mywebsite.com/blog/2015
./blog/2015
no comienza con/privacy-policy/
, indicar al navegador que vaya ahttp://www.mywebsite.com/blog/2015
./blog/2015
no comienza con/privacy-policy/
, indicar al navegador que vaya ahttp://www.mywebsite.com/blog/2015
.- [...]
Eliminar la referencia $1
de RewriteRule
no es suficiente, ya que una ruta URI de /
(o simplemente vacía) aún no califica como que comienza con /privacy-policy/
, lo que resulta en este comportamiento:
/blog/2015
no comienza con/privacy-policy/
, indicar al navegador que vaya ahttp://www.mywebsite.com/
./
no comienza con/privacy-policy/
, indicar al navegador que vaya ahttp://www.mywebsite.com/
./
no comienza con/privacy-policy/
, indicar al navegador que vaya ahttp://www.mywebsite.com/
.- [...]
Puedes verificar este comportamiento revisando los archivos de registro de tu instalación de Apache.
Solución
Si no planeas usar el enrutamiento de direcciones predeterminado de WordPress, no hay razón para mantener las reglas de reescritura predeterminadas y agregar más encima. Personalízalas según tus necesidades en lugar de añadir complejidad:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(/|index\.php)$ /index.php? [L]
RewriteRule ^/?privacy-policy/?$ /index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /? [L,R=301]
</IfModule>
En resumen:
-
RewriteRule ^(/|index\.php)$ /index.php? [L]
Si se solicitó explícitamente
/
oindex.php
, sirveindex.php
, pero elimina la cadena de consulta (para evitar cambiar páginas mediante manipulación de variables de consulta) y detén el procesamiento de reescrituras. -
RewriteRule ^/?privacy-policy/?$ /index.php [L]
Si se solicitó explícitamente
privacy-policy
(con o sin barras iniciales/finales), sirveindex.php
y detén el procesamiento de reescrituras. -
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /? [L,R=301]
Si el nombre de archivo solicitado no es un archivo ni un directorio, coincide con un solo carácter en cualquier lugar (para aplicar la regla independientemente del URI) y le dice al navegador que haga una nueva solicitud a
/
descartando su cadena de consulta. Detén el procesamiento de reescrituras.
Vale la pena mencionar que tu resultado deseado probablemente producirá muchos comportamientos inesperados: por ejemplo, es posible que no puedas acceder al panel de administración. Los archivos adjuntos también podrían romperse. Pero lo anterior debería proporcionar al menos un buen punto de partida para aprender más sobre directivas de reescritura.

gracias @florian, pero sigue sin funcionar, sigue redirigiendo a la misma página que intento alcanzar. No importa la URL, se redirige a sí misma infinitamente. PD: ¿por qué la extensión ".html"?

Lo siento, el '.html' efectivamente está obsoleto. Suena extraño que sigas siendo redirigido infinitamente. La mayoría de navegadores almacenan las redirecciones 301 en la caché. Recomendaría usar Firebug para Firefox. Si usas FireBug, en el menú desplegable de la pestaña Network hay una opción para deshabilitar la caché del navegador.
