htaccess eliminar index.php de la URL

Resuelto Nick asked hace 13 años • 11 respuestas

Tengo un problema por el cual Google ha indexado algunas páginas con la URL incorrecta.

La URL que están indexando es:

http://www.example.com/index.php/section1/section2

Necesito que redirija a:

http://www.example.com/section1/section2

.htaccess no es mi fuerte, por lo que cualquier ayuda sería muy apreciada.

Nick avatar Dec 06 '10 16:12 Nick
Aceptado

La respuesta original es realmente correcta, pero carece de explicación. Me gustaría agregar algunas explicaciones y modificaciones.

Sugiero leer esta breve introducción https://httpd.apache.org/docs/2.4/rewrite/intro.html (15 minutos) y consultar estas 2 páginas mientras lee.

https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html https://httpd.apache.org/docs/2.4/rewrite/flags.html


Esta es la regla básica para ocultarse index.phpde la URL. Pon esto en tu .htaccessarchivo raíz.

mod_rewritedebe estar habilitado con PHP y esto funcionará para la versión de PHP superior a 5.2.6.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php/$1 [L]

Piense %{REQUEST_FILENAME}como el camino después del anfitrión.

Por ejemplo https://www.example.com/index.html, %{REQUEST_FILENAME}es/index.html

Entonces, las últimas 3 líneas significan que, si no es un archivo normal !-fni un directorio !-d, entonces haga el archivo RewriteRule.

En cuanto a los formatos de RewriteRule:

ingrese la descripción de la imagen aquí

Entonces RewriteRule (.*) /index.php/$1 [L]significa que, si los 2 RewriteCondestán satisfechos, (.*)coincidirá con todo después del nombre de host. .coincide con cualquier carácter individual, .*coincide con cualquier carácter y (.*)hace que esto sea una variable a la que se puede hacer referencia $1y luego reemplazar con /index.php/$1. El efecto final es agregar un precedente index.phpa toda la ruta URL.

Por ejemplo https://www.example.com/hello, produciría https://www.example.com/index.php/hello internamente .

Otro problema clave es que esto efectivamente resuelve la cuestión. Internamente , (supongo) siempre es necesario https://www.example.com/index.php/hello, pero al reescribir, puedes visitar el sitio sin eso index.php, Apache lo agrega internamente.


Por cierto, .htaccessel documento de Apache no recomienda crear un archivo adicional.

La reescritura generalmente se configura en la configuración del servidor principal (fuera de cualquier <Directory>sección) o dentro de <VirtualHost> los contenedores. Esta es la forma más sencilla de reescribir y se recomienda.

Shakti Singh avatar Dec 06 '2010 09:12 Shakti Singh

Para eliminar index.phpde la URL y redirigir al visitante a la versión de la página que no es index.php:

RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

Esto redirigirá limpiamente /index.php/mybloga simplemente /myblog.

El uso de una redirección 301 preservará la clasificación en los motores de búsqueda de Google.

Bradley Flood avatar Jun 03 '2014 06:06 Bradley Flood
RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)index\.php($|\ |\?)
RewriteRule ^ /%1 [R=301,L]
Steve Bals avatar Jan 28 '2014 09:01 Steve Bals

Suponiendo que la URL existente es

http://example.com/index.php/foo/bar

y queremos convertirlo en

 http://example.com/foo/bar

Puedes utilizar la siguiente regla:

RewriteEngine on
#1) redirect the client from "/index.php/foo/bar" to "/foo/bar"
RewriteCond %{THE_REQUEST} /index\.php/(.+)\sHTTP [NC]
RewriteRule ^ /%1 [NE,L,R]
#2)internally map "/foo/bar" to "/index.php/foo/bar"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ /index.php/$1 [L]

En el spep #1 primero comparamos la cadena de solicitud y capturamos todo después de /index.php/ y el valor capturado se guarda en %1 var. Luego enviamos el navegador a una nueva URL. El número 2 procesa la solicitud internamente. Cuando el navegador llega a /foo/bar , #2rule reescribe la nueva URL en la ubicación original.

Amit Verma avatar Nov 03 '2016 07:11 Amit Verma