Eliminando la extensión .php con mod_rewrite

Quiero un conjunto de reglas mod_rewrite para poder referirme a una página sin la extensión .php, pero tengo que volver a escribir para incluir la extensión php. Esto se ejecutará en un servidor 1 & 1.

¿Hay alguna buena referencia para que yo pueda aprender más?

RewriteEngine On RewriteRule something something.php [L] 

http://example.com/something se manejará como si fuera una solicitud de something.php

Para redirigir todas las solicitudes que no son un archivo físico al mismo nombre pero con .php:

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

La respuesta aceptada anteriormente no elimina la extensión .php de las URL, solo le permite visitar archivos .php sin extensión. Para eliminar completamente la extensión .php de las URL, puede usar las siguientes Reglas en root/.htaccess :

 RewriteEngine on #1)externally redirect "/file.php" to "/file" RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ /%1 [NC,L,R] #2)Internally map "/file" back to "/file.php" RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ /$1.php [NC,L] 

Probablemente lo que realmente quieres es solo una manera de no tener el sufijo en absoluto. La mejor forma que he encontrado de hacer esto es usar la directiva Files en .htaccess o en los archivos de configuración de apache:

  SetHandler cgi-script  

Esto evita algunas de las desventajas de las reescrituras, por ejemplo, el acceso directo del archivo .php.

Archivo .htaccess: agregue las siguientes líneas:

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

https://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/

Ahora debería verificar la condición AllowOverride en el archivo apache2.log: configure las opciones AllowOverRide All en su directorio raíz web:

  Options Indexes FollowSymLinks AllowOverride All Require all granted 

Si intenta acceder a su página web sin la extensión .php, puede encontrar el siguiente error en su archivo apache error.log: /var/www/html/web/.htaccess: Comando inválido ‘RewriteEngine’, quizás mal escrito o definido por un módulo no incluido en la configuración del servidor

Para solucionarlo: no tiene instalado el módulo mod_rewrite. Para instalarlo, ejecute el siguiente comando: ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

.htaccess: comando inválido ‘RewriteEngine’, quizás mal escrito o definido por un módulo no incluido en la configuración del servidor

Una vez más, después de actualizar la página web, puede obtener el siguiente error en el archivo error.log:

 [negotiation:error] [pid 4650] [client 127.0.0.1:46461] AH00687: Negotiation: discovered file(s) matching request: /var/www/html/web/test (None could be negotiated). (I was trying to access localhost/web/test.php using the url: localhost/web/test) 

Para solucionarlo, deberá agregar las siguientes líneas en apache2.conf:

  AddType application/x-httpd-php .php AddType application/x-httpd-php .phtml AddType application/x-httpd-php .php3 AddType application/x-httpd-php .php4 AddType application/x-httpd-php .html AddType application/x-httpd-php-source .phps 

https://forums.digitalpoint.com/threads/htaccess-addtype-application-x-httpd-php-php-htm-html-and-maybe-a-fix.7584/#post-2491687

Ahora, puedo acceder al archivo test.php utilizando solo el nombre de archivo: test

Esta opción hará que las URL sean amigables con SEO. Eliminar extensiones.php de la URL visible y garantizar que las URL accedidas sin .php aún mostrarán el archivo .php. No he podido encontrar otra respuesta que haya logrado esto en varios hilos.

Recuerde habilitar la reescritura mod. En Debian o Unbuntu Linux, lo siguiente funcionará

sudo a2enmod reescribir

y

sudo service apache2 restart

Modifique la sección correspondiente de su archivo apache2.conf a lo siguiente.

  Options Indexes FollowSymLinks AllowOverride All Require all granted RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) $1.php [L] RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ /%1 [NC,L,R]  

Si utiliza .htaccess para volver a escribir, asegúrese de que apache2.conf al menos tenga habilitadas estas opciones.

  Options Indexes FollowSymLinks AllowOverride All Require all granted RewriteEngine On  

Por último, en algunas instalaciones de Apache, es posible que deba establecer AllowOveride All en un archivo .conf en / etc / apache2 / sites-available o / etc / apache2 / sites-enabled.
Se rumorea que la reescritura del archivo apache2.conf en lugar de .htaccess es más rápida.

Para obtener http://example.com/test linking http://example.com/test.php use:

 RewriteEngine on RewriteRule ^([^\.]+)$ /folder/$1.php [NC,L] 

Por alguna razón, no pude obtener ninguna otra solución que funcione correctamente. Puse esto en un archivo .htaccess en la raíz de mi sitio. Se espera que esto funcione para usted.

 RewriteEngine on #only use this once per .htaccess RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php 

Es importante tener en cuenta que si su encabezado o URL contiene la extensión .php, no se eliminará. Tendrá que quitar la extensión.

Utilizar esta…

 header 'location: /login'; 

En vez de esto…

 header 'location: /login.php'; 

Para dirigir algunos archivos individuales, puede ser más fácil evitar el RewriteEngine.

He usado esto:

  SetHandler application/x-httpd-php  

Eso es menos poderoso y flexible que la reescritura, pero probablemente sea más rápido y parece ser el camino a seguir si solo desea manejar algunos archivos específicos como PHP.