Eliminar ‘index.php’ de la URL con .htaccess

He estado probando todo tipo de soluciones desde este sitio y ninguna parece funcionar. Actualmente estoy alojando con hostgator. Este es mi archivo .htaccess actual:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php/$1 [L]   suPHP_ConfigPath /home/user/php.ini  order allow,deny deny from all   

Esto está en la carpeta raíz de mi sitio. También he intentado agregar un ? después de index.php y sin suerte. ¿Alguien sabe por qué esto no está funcionando?

Este es el código que puede usar en su .htaccess (en DOCUMENT_ROOT) para eliminar index.php del URI:

 Options +FollowSymLinks -MultiViews # Turn mod_rewrite on RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?$1 [L,QSA] RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s(.*)/index\.php [NC] RewriteRule ^ %1 [R=301,L] 

Symfony 2 tiene una excelente solución:

 RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by apache RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] RewriteCond %{REQUEST_FILENAME} -f RewriteRule .? - [L] RewriteRule .? %{ENV:BASE}/index.php [L] 

Esto logra lo siguiente:

  • RewriteBase no es necesario (es útil cuando el sitio está en un subdirectorio debajo de la raíz web)
  • index.php se elimina si está presente
  • La solicitud se enruta al index.php correcto con la cadena de consulta completa de la solicitud original

Tenga en cuenta que la línea:

 RewriteRule ^(.*) - [E=BASE:%1] 

es responsable de establecer la variable %{ENV:BASE} para más adelante. Consulte la documentación de Apache en el indicador E|env .

Intenté esto y funciona bien:

  RewriteEngine On RewriteBase / # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] # Directs all EE web requests through the site index file RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php/$1 [L]  

Excepciones

Si se ha cambiado el nombre del directorio del sistema de su sitio (/ system /) y todavía se puede acceder a él por URL, modifique la línea RewriteCond que aparece arriba:

 RewriteCond %{REQUEST_URI} !/newdirectoryname/.* [NC] 

Si está ejecutando EE desde un subdirectorio en lugar de hacerlo desde la raíz de su dominio (p. Ej., http://example.com/myeesite/ en lugar de http://example.com/ ), simplemente elimine la barra inclinada que precede a index.php en la línea RewriteRule arriba, así:

 RewriteRule ^(.*)$ index.php/$1 [L] 

Si está ejecutando EE desde un subdirectorio y aún no funciona después de eliminar la barra oblicua, es posible que deba especificar el subdirectorio en la regla de reescritura. Por ejemplo, si su subcarpeta se llama prueba, cambie:

 RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

A:

 RewriteRule (.*?)index\.php/*(.*) testing/$1$2 [R=301,NE,L] 

Y cambio:

 RewriteRule ^(.*)$ /index.php/$1 [L] 

A:

 RewriteRule ^(.*)$ testing/index.php/$1 [L] If your host requires forcing query strings, try adding a question mark following index.php in the RewriteRule line above, like so: RewriteRule ^(.*)$ /index.php?/$1 [L] 

Respuesta actualizada

En estos días solo uso el .htaccess WordPress como base: es relativamente simple y funciona como se esperaba:

  RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  

También es sencillo forzar https:// si lo deseas:

  RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST} [L,R=301] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  

Publicación original de 2012

Mi sugerencia inicial fue primero hacer un redireccionamiento difícil (para quitar index.php ) y luego un redireccionamiento interno de nuevo a index.php .

El problema es que una combinación ambiciosa de redirección interna (por ejemplo, al usar (.*) ) Parece desencadenar la redirección de nuevo, lo que lleva a un ciclo de redirección infinito.

Siento que hay una solución más elegante que la que estoy por sugerir, pero desafortunadamente no tengo los conocimientos de Apache para pensar en ello.

Lo que haría es tener una RewriteRule que realice una redirección para eliminar el index.php y luego un conjunto de reglas de redirección internas para llevarlo desde allí. Por ejemplo:

  RewriteEngine On RewriteRule ^index\.php(.*)$ /$1 [R,L,QSA] RewriteRule ^pie$ /index.php?pie [L,QSA]  

Esto parece funcionar correctamente sin producir 500 errores. Pero, de nuevo, recomiendo una pizca de sal.

Si bien eso está muy lejos de ser una buena solución, espero que ayude.

Me he visto obligado a unirme a stack overflow.com hoy para comentar aquí, ya que la respuesta ha resuelto un problema a largo plazo que he tenido con un sitio web de Zend Framework. He trabajado en el sitio web durante aproximadamente 3 años y medio y durante ese tiempo descubrí que no manejaba index.php correctamente y esto causa que las herramientas del webmaster vean títulos duplicados, etc.

Decidí buscar nuevamente una solución hoy, una de las muchas veces que intenté.

Esta es la única (la última respuesta que se muestra arriba) que resuelve mi problema.

  # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

Como ejemplo. esto es lo que logra para mí.

http://www.domainname.co.uk/index.php/categories/url-name.html

se convierte

http://www.domainname.co.uk/categories/url-name.html

Gracias a todos los que contribuyeron a la pregunta original, ya que conducen a la respuesta y la solución anterior.

Nota adicional: Tengo otros comandos de reescritura que manejan los otros aspectos, pero por sí solos no corrigieron el index.php y el único momento en que esto se solucionó es usando.

 # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

Solo espero que ayude a otros ya sea ExpressionEngine o Zend Framework en el futuro.

Para eliminar index.php de las URL en apache2.4 , puede usar la siguiente regla:

  RewriteEngine on RewriteRule ^index\.php/(.+)$ /$1 [L,R] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !index\.php /index.php%{REQUEST_URI} [L,END] 

Esto cambiará el uri

 /index.php/foobar 

a

 /foobar 

Esta regla devolverá un error interno del servidor para las versiones inferiores de apache ya que no son compatibles con el indicador END . Por favor, vea la respuesta de anubhava que funciona casi en todas las versiones.