web-dev-qa-db-fra.com

Supprimer l'extension .php avec mod_rewrite

Je veux un ensemble de règles mod_rewrite afin de pouvoir faire référence à une page sans l'extension .php, mais je l'ai réécrit pour inclure l'extension php. Cela fonctionnera sur un serveur 1 & 1.

Existe-t-il de bonnes références pour que je puisse en apprendre plus moi-même?

38
James
RewriteEngine On
RewriteRule something something.php [L]

http://example.com/something sera traité comme s'il s'agissait d'une demande pour something.php

Pour rediriger toutes les demandes qui ne sont pas un fichier physique portant le même nom mais avec .php:

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

La réponse acceptée ci-dessus ne supprime pas l'extension .php des URL, elle vous permet uniquement de consulter les fichiers .php sans extension. Pour supprimer complètement l'extension .php des URL, vous pouvez utiliser les règles suivantes dans 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]
11
starkeen

Probablement ce que vous voulez vraiment est juste un moyen de ne pas avoir le suffixe du tout. Pour ce faire, la meilleure façon consiste à utiliser la directive Files dans les fichiers de configuration .htaccess ou Apache:

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

Cela évite certains des inconvénients des réécritures, telles que l’accès direct au fichier .php

3
Poor Yorick

Fichier .htaccess: ajoutez les lignes suivantes:

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/

Vous devez maintenant vérifier la condition AllowOverride dans le fichier Apache2.log: Set options AllowOverRide All dans votre répertoire racine Web:

    Options Indexes FollowSymLinks  
    AllowOverride All  
    Require all granted

Si vous essayez d'accéder à votre page Web sans l'extension .php, vous pouvez rencontrer l'erreur suivante dans votre fichier error.log Apache: /var/www/html/web/.htaccess: commande 'RewriteEngine' non valide, éventuellement mal orthographiée ou définie par un module non inclus dans la configuration du serveur

Pour résoudre ce problème: Le module mod_rewrite n'est pas installé. Pour l'installer: Exécutez la commande suivante: ln -s /etc/Apache2/mods-available/rewrite.load/etc/Apache2/mods-enabled/rewrite.load

.htaccess: commande non valide 'RewriteEngine', mal orthographiée ou définie par un module non inclus dans la configuration du serveur

Encore une fois, après avoir actualisé la page Web, le fichier error.log peut contenir l'erreur suivante:

[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)

Pour résoudre ce problème, vous devez ajouter les lignes suivantes dans 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-htp-htm-html-and-maybe-a-fix.7584/#post-2491687

Maintenant, je peux accéder au fichier test.php en utilisant simplement le nom de fichier: test

2
user3683297

Cette option créera des URL propres à SEO. Supprimer les extensions .php de l'URL visible et s'assurer que les URL auxquelles on accède sans le .php continueront d'afficher le fichier .php. Je suis incapable de trouver une autre réponse qui a réalisé ceci sur plusieurs threads. 

N'oubliez pas d'activer le réécriture de mod. Sous Debian ou Unbuntu linux, ce qui suit fonctionnera

Sudo a2enmod réécrire

et

Service Sudo Apache2 redémarrer

Modifiez la section correspondante de votre fichier Apache2.conf comme suit.

<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 vous utilisez .htaccess pour réécrire, assurez-vous que ces options sont au moins activées dans Apache2.conf.

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

Enfin, sur certaines installations Apache, vous devrez peut-être également définir AllowOveride All Dans un fichier .conf situé dans/etc/Apache2/sites-available ou/etc/Apache2/sites-enabled.
Il est supposé que la réécriture à partir du fichier Apache2.conf, par opposition à .htaccess, soit plus rapide. 

1
Greggory Wiley

Pour diriger quelques fichiers uniques, il peut être plus facile d’éviter le RewriteEngine. 

J'ai utilisé ceci:

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

C'est moins puissant et moins flexible que la réécriture, mais probablement plus rapide et cela semble être la voie à suivre si vous souhaitez que quelques fichiers spécifiques soient gérés au format PHP. 

0
John

Pour obtenir http://example.com/test link http://example.com/test.php use

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

Pour une raison quelconque, aucune autre solution ne fonctionnait correctement. Je mets cela dans un fichier .htaccess à la racine de mon site. J'espère que cela fonctionnera pour vous.

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

N'oubliez pas que si votre en-tête ou votre URL contient l'extension .php, elle ne sera pas supprimée. Vous aurez besoin de supprimer l'extension.

Utilisez ceci...

header 'location: /login';

plutôt que cela ...

header 'location: /login.php';
0
EternalHour