Eliminar la extensión .php con .htaccess

101

Sí, leí el manual de Apache y busqué aquí. Por alguna razón, simplemente no puedo hacer que esto funcione. Lo más cerca que he estado es que elimine la extensión, pero apunta al directorio raíz. Quiero que esto funcione en el directorio que contiene el .htaccessarchivo.

Necesito hacer tres cosas con el .htaccessarchivo.

  1. Lo necesito para eliminar el .php

    a. Tengo varias páginas que usan pestañas y la URL se parece a page.php # pestaña, ¿es posible?

    si. Tengo una página que usa un ID de sesión adjunto a la URL para asegurarme de que viene del lugar correcto www.domain.com/download-software.php?abcdefg.

es posible? También al hacer esto, ¿necesito eliminar ".php" de los enlaces en mi archivo de inclusión de navegación de encabezado? DeberíaIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Me gustaría forzar "www" antes de cada URL, así que no lo es domain.com, pero www.domain.com/page.
  2. Me gustaría eliminar todas las barras inclinadas de las páginas.

Seguiré buscando, intentando, etc. ¿Estar en un subdirectorio causaría algún problema?

Diseño de pájaro sucio
fuente
Solo tengo curiosidad, ¿qué beneficio es esto? ¿Es esto para que sus usuarios no sepan a qué archivo de su servidor están accediendo?
Cañón Kolob
dos veces. por lo que no saben qué tipos de archivos estamos sirviendo, y simplemente se ve más limpio IMO
Dirty Bird Design
Otra pregunta relacionada: stackoverflow.com/questions/6534904/… .
Edward

Respuestas:

121

La respuesta de Gumbo en la pregunta de Stack Overflow Cómo ocultar la extensión .html con Apache mod_rewrite debería funcionar bien.

Re 1) Cambiar el .html a .php

Re a.) Sí, es posible, solo agréguelo #taba la URL.

Re b.) Eso es posible usando QSA(Query String Append), ver más abajo.

Esto también debería funcionar en una ruta de subdirectorio:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
Pekka
fuente
gracias por su ayuda, por el motivo que sea, apuesto a que debido a que la URL adjunta a la sesión está codificada en el archivo PHP (historia larga), puedo acceder sin lo anterior. Realmente agradezco tu ayuda, esto .htaccess es complicado para mí.
Dirty Bird Design
8
@Pekka 웃 eliminar el espacio entre el [L,espacio de QSA]banderas, de lo contrario 500 Internal Server Error causará.
Rahil Wazir
esto hará que /index/bla/blasea ​​lo mismo queindex.php
elkebirmed
por alguna razón este bloque mi CSS para cargar: /
TheCrazyProfessor
! significa que no. Esa regla dice que solo se reescriba para agregar .php si aún no termina en .php
user339568
72

Apache mod_rewrite

Lo que estás buscando es mod_rewrite ,

Descripción: proporciona un motor de reescritura basado en reglas para reescribir las URL solicitadas sobre la marcha.

En términos generales, mod_rewritefunciona haciendo coincidir el documento solicitado con expresiones regulares especificadas, luego realiza reescrituras de URL internamente (dentro del proceso de Apache) o externamente (en el navegador del cliente). Estas reescrituras pueden ser tan simples como traducir internamente example.com/foo en una solicitud para example.com/foo/bar.

Los documentos de Apache incluyen una mod_rewriteguía y creo que en ella se tratan algunas de las cosas que desea hacer. Guía detallada de mod_rewrite .

Forzar el wwwsubdominio

Me gustaría forzar "www" antes de cada URL, por lo que no es dominio.com sino www.dominio.com/página

La guía de reescritura incluye instrucciones para esto en el ejemplo de Canonical Hostname .

Eliminar barras inclinadas (parte 1)

Me gustaría eliminar todas las barras inclinadas de las páginas.

No estoy seguro de por qué querría hacer esto, ya que la guía de reescritura incluye un ejemplo para exactamente lo contrario , es decir, siempre incluye una barra al final. Los documentos sugieren que eliminar la barra inclinada tiene un gran potencial para causar problemas:

Problema de barra inclinada final

Descripción:

Cada webmaster puede cantar una canción sobre el problema de la barra al final de las URL que hacen referencia a directorios. Si faltan, el servidor arroja un error, porque si dices en /~quux/foolugar de, /~quux/foo/ entonces el servidor busca un archivo llamado foo. Y debido a que este archivo es un directorio, se queja. En realidad, intenta arreglarlo por sí mismo en la mayoría de los casos, pero a veces este mecanismo debe ser emulado por usted. Por ejemplo, después de haber realizado muchas reescrituras de URL complicadas en scripts CGI, etc.

¿Quizás podría explicar por qué desea eliminar la barra al final todo el tiempo?

Quitar .phpextensión

Lo necesito para eliminar el .php

Lo más parecido a hacer esto que se me ocurre es reescribir internamente cada documento de solicitud con una extensión .php, es decir, example.com/somepage se procesa en su lugar como una solicitud para example.com/somepage.php. Tenga en cuenta que proceder de esta manera requeriría que cada alguna página exista realmente como alguna página.php en el sistema de archivos.

Con la combinación correcta de expresiones regulares, esto debería ser posible hasta cierto punto. Sin embargo, puedo prever algunos posibles problemas con las páginas de índice que no se solicitan correctamente y que no coinciden con los directorios correctamente.

Por ejemplo, esto reescribirá correctamente example.com/test como una solicitud para example.com/test.php:

RewriteEngine  on
RewriteRule ^(.*)$ $1.php

Pero hará que example.com no se cargue porque no hay example.com/.php

Supongo que si está eliminando todas las barras inclinadas, elegir una solicitud para un índice de directorio de una solicitud para un nombre de archivo en el directorio principal será casi imposible. ¿Cómo se determina una solicitud para el directorio 'foobar':

example.com/foobar

desde una solicitud de un archivo llamado foobar (que en realidad es foobar.php)

example.com/foobar

Podría ser posible si usó la RewriteBasedirectiva. Pero si lo hace, este problema se complica mucho más, ya que necesitará RewriteConddirectivas para verificar el nivel del sistema de archivos si la solicitud se asigna a un directorio o archivo.

Dicho esto, si elimina el requisito de eliminar todas las barras diagonales finales y, en su lugar, fuerza la adición de barras diagonales finales, el problema de "sin extensión .php" se vuelve un poco más razonable.

# Turn on the rewrite engine
RewriteEngine  on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]

Esto todavía no es perfecto: cada solicitud de un archivo todavía tiene .php agregado a la solicitud internamente. Una solicitud de 'hi.txt' pondrá esto en sus registros de errores:

[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat

Pero hay otra opción, configure las directivas DefaultTypey DirectoryIndexasí:

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

Actualización 14-11-2013: se corrigió el fragmento anterior para incorporar la observación de nicorellius

Ahora las solicitudes de hi.txt (y cualquier otra cosa) tienen éxito, las solicitudes a example.com/test devolverán la versión procesada de test.php y los archivos index.php volverán a funcionar.

Debo dar crédito a quien se debe el crédito por esta solución, ya que la encontré en el blog de Michael J. Radwins buscando en Google php sin extensión apache .

Eliminar barras al final

Algunas búsquedas apache remove trailing slashesme llevaron a algunas páginas de optimización de motores de búsqueda. Aparentemente, algunos sistemas de gestión de contenido (Drupal en este caso) harán que el contenido esté disponible con y sin una barra diagonal en las URL, lo que en el mundo del SEO hará que su sitio incurra en una penalización por contenido duplicado. Fuente

La solución parece bastante trivial, usando mod_rewritereescribimos con la condición de que el recurso solicitado termine en a /y reescriba la URL enviando el 301 Permanent Redirectencabezado HTTP.

Este es su ejemplo que asume que su dominio es blamcast.net y permite que la solicitud tenga el prefijo opcionalmente www..

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

Ahora estamos llegando a alguna parte. Pongamos todo junto y veamos cómo se ve.

Obligatorio www., no .phpy sin barras al final

Esto supone que el dominio es foobar.com y se ejecuta en el puerto estándar 80.

# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html

# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST}   !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST}   !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*)         http://www.foobar.com/$1 [L,R,NE]

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

La bandera 'R' se describe en la RewriteRulesección de la directiva. Retazo:

redirect|R [=code](forzar redirección) Sustitución de prefijo con http://thishost[:thisport]/(que convierte la nueva URL en un URI) para forzar una redirección externa. Si no se proporciona ningún código, se devolverá una respuesta HTTP de 302 ( MOVED TEMPORARILY ).

Nota final

No pude hacer que la eliminación de la barra oblicua funcionara correctamente. La redirección terminó dándome bucles de redirección infinitos. Después de leer la solución original más de cerca, tengo la impresión de que el ejemplo anterior les funciona debido a cómo está configurada su instalación de Drupal. Menciona específicamente:

En un sitio Drupal normal, con URL limpias habilitadas, estas dos direcciones son básicamente intercambiables

En referencia a las URL que terminan con y sin barra. Además,

Drupal usa un archivo llamado .htaccesspara decirle a su servidor web cómo manejar las URL. Este es el mismo archivo que habilita la magia de URL limpia de Drupal. Al agregar un comando de redireccionamiento simple al principio de su .htaccessarchivo, puede forzar al servidor a eliminar automáticamente las barras al final.

Tim Bielawa
fuente
wow gracias por todo eso. De hecho, pude hacer que funcionara, resulta que había algunas cosas raras en mi servidor que tuve que cambiar. De todos modos, ahora con el siguiente problema, eliminando el .php de todas las páginas excepto una. thx man
Dirty Bird Design
Me encanta ver respuestas bien pensadas y organizadas. Buen trabajo ... Una cosa que noté: ¿te refieres DirectoryIndex index index.html? o DirectoryIndex index.php index.html?
nicorellius
@nicorellius cree que tienes razón. He actualizado mi respuesta original con su observación.
Tim Bielawa
Debo decir que esto no siempre funciona. Pruebe la respuesta a continuación (del usuario 1079877)
DonJoe
Eres el verdadero MVP.
ZainZaheer06
45

Además de otras respuestas anteriores,

También puede intentar esto para eliminar completamente las extensiones .php de su archivo y evitar un bucle infinito :

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]

Este código funcionará en Root / .htaccess. Asegúrese de cambiar RewriteBase si desea colocarlo en un archivo htaccess en el subdirectorio.

Editar:

En apache 2.4 y versiones posteriores, también puede usar el indicador END para evitar el error de bucle infinito. El siguiente ejemplo funciona igual que el anterior en apache 2.4,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]
Amit Verma
fuente
10
Hola gracias por esto He probado muchas soluciones para cortar .php, pero solo esto funcionó correctamente :)
beamkiller
4
¡Gracias! Esta edición es donde su at, apache 2.4, apache 2.5 terminan en el bucle infinito (y 500) [FIN] super importante
Jake Bolam
23

El siguiente código funciona bien para mí:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
usuario1079877
fuente
Esto funciona excepto que example.com se convierte en un índice de todos los archivos y directorios. (Apache 2.4)
earth2jason
10

Después de cambiar el parámetro AllowOverridede Nonea Allen /etc/apache2/apache2.conf(Debian 8), a raíz de esto , el archivo .htaccess simplemente debe contener:

Options +MultiViews
AddHandler php5-script php
AddType text/html php

Y fue suficiente para ocultar la extensión .php de los archivos.

Rodney Salcedo
fuente
Ojalá este estuviera más arriba. ¿Por qué molestarse con la sobrecarga de la reescritura de URL cuando MultiViewshace esto de inmediato
Phil
Esto es genial. ¿Algún inconveniente?
reformado el
@reformed Gracias. Tuve que cambiar enlaces de <a href="somepage.php">enlace </a>a <a href="somepage">enlace </a>en el código fuente
Rodney Salcedo
8

Prueba esto
El siguiente código definitivamente funcionará

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
Samarth Saxena
fuente
5

No estoy seguro de por qué las otras respuestas no funcionaron para mí, pero este código que encontré sí:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Eso es todo lo que está en mi htaccess y example.com/page muestra example.com/page.php

Jon
fuente
4

Para eliminar la extensión .php de un archivo PHP, por ejemplo, yoursite.com/about.php a yoursite.com/about Siga estos pasos. Abra el archivo .htaccess (cree uno nuevo si no existe) desde la raíz de su sitio web y agregue el siguiente código.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Para eliminar la extensión .html de un archivo html, por ejemplo, yoursite.com/about.html a yoursite.com/about Siga estos pasos.

Abra el archivo .htaccess (cree uno nuevo si no existe) desde la raíz de su sitio web y agregue el siguiente código.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Referencia: Cómo eliminar la extensión php de la URL

Sanjeev Kumar
fuente
1
La única respuesta que necesitaba. ¡Gracias! :)
MatrixCow08
2

Si está codificando en PHP y desea eliminar .php para que pueda tener una URL como:

http://yourdomain.com/blah -> que apunta a /blah.php

Esto es todo lo que necesitas:

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
Jeff Hays
fuente
2

Encontré el concepto 100% funcional para mí:

# Options is required by Many Hosting
Options +MultiViews

RewriteEngine on

# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Utilice este código en la raíz del archivo .htaccess de su sitio web como:

fuera de línea - wamp \ www \ YourWebDir

en línea - public_html /

Si no funciona correctamente, cambie la configuración de su servidor Wamp: 1) Haga clic con el botón izquierdo en el icono WAMP 2) Apache 3) Módulos Apache 4) Haga clic con el botón izquierdo en rewrite_module

Irshad Khan
fuente
No puede tener dos RewriteRules con la etiqueta Luno al lado del otro. [L]dice mod_rewriteque es la última regla para el especificado RewriteCond.
MD XF
2

Aquí está el código que usé para ocultar la .phpextensión del nombre del archivo:

## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]

Nota: R=301es para redireccionamiento permanente y se recomienda su uso con fines de SEO. Sin embargo, si uno solo quiere una redirección temporal, reemplácela con soloR

Rahul Gupta
fuente
2

Terminé con el siguiente código de trabajo:

RewriteEngine on 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
Nadeem
fuente
1

Si su URL en PHP como http://yourdomain.com/demo.php que viene como http://yourdomain.com/demo

Esto es todo lo que necesitas:

crear archivo .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Kamlesh
fuente
Funcionó para http://example.com/myfile pero no funcionó para http://example.com/myfolder/(archivo de índice). ¿Pueden ayudarme a que funcione para el archivo de índice?
Wesley Gonçalves
Creo que deberías probar la URL de respuesta de @starkeen anterior: stackoverflow.com/a/30566026/3786343
Kamlesh
1

Tratar

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