htaccess eliminar index.php de la URL
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.
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.php
de la URL. Pon esto en tu .htaccess
archivo raíz.
mod_rewrite
debe 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 !-f
ni un directorio !-d
, entonces haga el archivo RewriteRule
.
En cuanto a los formatos de RewriteRule:
Entonces RewriteRule (.*) /index.php/$1 [L]
significa que, si los 2 RewriteCond
está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 $1
y luego reemplazar con /index.php/$1
. El efecto final es agregar un precedente index.php
a 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, .htaccess
el 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.
Para eliminar index.php
de 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/myblog
a simplemente /myblog
.
El uso de una redirección 301 preservará la clasificación en los motores de búsqueda de Google.
RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)index\.php($|\ |\?)
RewriteRule ^ /%1 [R=301,L]
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.