2011-02-05 27 views
36

Quiero un conjunto de reglas mod_rewrite para que pueda 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.Eliminando la extensión .php con mod_rewrite

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

+0

posible duplicado de [Hacer una reescritura eliminar la extensión .php?] (Http: // stackoverflow.com/questions/781738/making-a-rewriterule-remove-php-extension) –

+4

Tenga en cuenta que está creando un recurso permanente para el resto de la web cuando hace una pregunta y obtiene respuestas de otros. Use un título de pregunta significativo y no escriba el cuerpo como si fuera una carta personal. –

+0

posible duplicado de [¿Cómo eliminar la extensión de archivo de la dirección del sitio web? (fotos de muestra adjuntas)] (http://stackoverflow.com/questions/6534904/how-to-remove-file-extension-from-website-address-sample-photos-attached) –

Respuesta

48
RewriteEngine On 
RewriteRule something something.php [L] 

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

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

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

Eso es genial, puedo confirmar que funciona , pero ¿cómo hago esto generalmente para todas las páginas? También sería bueno si contact.php fuera redirigido a solo "contacto". – James

+0

Bueno, debe identificar y codificar la asignación entre los URI y los archivos físicos. He editado mi respuesta para darte un ejemplo. Si desea que contact.php redirija para contactar, entonces 'RewriteRule contact.php contacta [R = 301, L]'. Para redirigir todas las solicitudes que terminan en .php, 'RewriteRule (. *) \. Php $ 1 [R = 301, L]'. Tenga en cuenta el uso de R = 301 para forzar un redireccionamiento HTTP 301 permanentemente movido, que hace que el navegador envíe una nueva solicitud HTTP para la nueva URL, que a su vez desencadenará la asignación de la regla de la URL de nuevo al archivo .php que realmente maneja eso. –

+0

Estoy haciendo exactamente esto: 'RewriteRule (. *) \. Php/$ 1 [R = 301, L]' 'RewriteCond% {REQUEST_FILENAME}! -d' ' RewriteCond% {REQUEST_FILENAME}! -f' 'RewriteRule^([A-Za-z0-9 -] *) $ $ 1.php [L]' Y termina en un bucle de redirección. – Mauro

2

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

<Files myscript> 
    SetHandler cgi-script 
</Files> 

Esto evita algunos de los inconvenientes de reescrituras, por ejemplo, el acceso directo del. php archivo.

0

Por alguna razón yo no era capaz de conseguir cualquier 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.

Utilice esta ...

header 'location: /login'; 

en lugar de esto ...

header 'location: /login.php'; 
9

La respuesta aceptada anterior no quite la extensión .php de urls que sólo le permite visitar .php archivos sin extensión. Para eliminar la extensión .php completamente de direcciones 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] 
0

Para dirigir un par de archivos individuales que podría ser más fácil evitar la RewriteEngine.

He utilizado este:

<Files $filename> 
    SetHandler application/x-httpd-php 
</Files> 

que es menos potente y flexible que reescritura, pero probablemente más rápido y parece que el camino a seguir si desea tener sólo unos pocos archivos específicos manejados como PHP.

2

.htaccess: añadir 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 usted tendría que comprobar la condición AllowOverride en el archivo apache2.log: Configurar las opciones del AllowOverride All en el directorio raíz del servidor web:

Options Indexes FollowSymLinks 
    AllowOverride All 
    Require all granted 

Si intenta acceder a su página web sin la extensión .php, puede ejecutar el siguiente error en su archivo error.log de apache: /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 solucionar esto: 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: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration

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 se tendría que añadir las siguientes líneas en apache2.conf:

<IfModule mod_mime.c> 
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 tener acceso al archivo test.php utilizando sólo el nombre de archivo: prueba

0

Esta opción hará que las URL sean amigables con el 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 modificación de mods. En Debian o Linux Unbuntu el siguiente trabajo

sudo a2enmod reescribir

y

sudo service apache2 restart

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

<Directory /var/www/> 
     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] 
</Directory> 

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

<Directory /var/www/> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Require all granted 
     RewriteEngine On 
</Directory> 

último en alguna instalación de Apache puede que tenga que configurar también 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.

Cuestiones relacionadas