Supprimer l'extension .php avec .htaccess

101

Oui, j'ai lu le manuel Apache et cherché ici. Pour une raison quelconque, je ne peux tout simplement pas faire fonctionner cela. Le plus proche que je suis venu est de lui faire supprimer l'extension, mais cela pointe vers le répertoire racine. Je veux que cela fonctionne uniquement dans le répertoire qui contient le .htaccessfichier.

Je dois faire trois choses avec le .htaccessfichier.

  1. J'en ai besoin pour supprimer le .php

    une. J'ai plusieurs pages qui utilisent des onglets et l' URL ressemble à page.php # tab - est-ce possible?

    b. J'ai une page qui utilise un identifiant de session ajouté à l'URL pour m'assurer que vous venez du bon endroit www.domain.com/download-software.php?abcdefg,.

Est-ce possible? Aussi, pour ce faire, dois-je supprimer ".php" des liens dans mon fichier d'inclusion de navigation d'en-tête? DevraitIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Je voudrais qu'il force "www" avant chaque URL, donc ce n'est pas domain.com, mais www.domain.com/page.
  2. Je voudrais supprimer toutes les barres obliques de fin des pages.

Je vais continuer à chercher, essayer, etc. Est-ce que le fait d'être dans un sous-répertoire poserait des problèmes?

Conception d'oiseau sale
la source
Je suis juste curieux, quel avantage est-ce? Est-ce pour que vos utilisateurs ne sachent pas à quel fichier sur votre serveur ils accèdent?
Kolob Canyon
deux fois. donc ils ne savent pas quels types de fichiers nous servons, et cela semble juste plus propre IMO
Dirty Bird Design
Une autre question connexe: stackoverflow.com/questions/6534904/… .
Edward

Réponses:

121

La réponse de Gumbo à la question Stack Overflow Comment masquer l'extension .html avec Apache mod_rewrite devrait fonctionner correctement.

Re 1) Changez le .html en .php

Re a.) Oui, c'est possible, ajoutez simplement #tabà l'URL.

Re b.) C'est possible en utilisant QSA(Query String Append), voir ci-dessous.

Cela devrait également fonctionner dans un chemin de sous-répertoire:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
Pekka
la source
merci pour votre aide, pour quelque raison que ce soit, je parie que l'URL de la session est codée en dur dans le fichier PHP (longue histoire), je peux y accéder sans ce qui précède. J'apprécie vraiment votre aide, ce truc .htaccess est délicat pour moi.
Dirty Bird Design
8
@Pekka 웃 supprime l'espace entre [L,les QSA]indicateurs d' espace , sinon une erreur de serveur interne 500 provoquera.
Rahil Wazir
ce sera /index/bla/blale même queindex.php
elkebirmed
pour une raison quelconque, cela bloque mon CSS à charger: /
TheCrazyProfessor
! signifie non. Cette règle dit de ne réécrire pour ajouter .php que si cela ne se termine pas déjà par .php
user339568
72

Apache mod_rewrite

Ce que vous recherchez est mod_rewrite ,

Description: fournit un moteur de réécriture basé sur des règles pour réécrire les URL demandées à la volée.

De manière générale, mod_rewritefonctionne en faisant correspondre le document demandé avec des expressions régulières spécifiées, puis effectue des réécritures d'URL en interne (dans le processus apache) ou en externe (dans le navigateur du client). Ces réécritures peuvent être aussi simples que la traduction interne de example.com/foo en une requête par exemple.com/foo/bar.

La documentation Apache comprend un mod_rewriteguide et je pense que certaines des choses que vous voulez faire y sont couvertes. Guide mod_rewrite détaillé .

Forcer le wwwsous - domaine

Je voudrais qu'il force "www" avant chaque URL, donc ce n'est pas domain.com mais www.domain.com/page

Le guide de réécriture comprend des instructions pour cela sous l' exemple de nom d' hôte canonique .

Supprimer les barres obliques (partie 1)

Je souhaite supprimer toutes les barres obliques de fin des pages

Je ne sais pas pourquoi vous voudriez faire cela car le guide de réécriture comprend un exemple pour l'exact opposé , c'est-à-dire, toujours avec une barre oblique de fin. La documentation suggère que la suppression de la barre oblique de fin a un grand potentiel de causer des problèmes:

Problème de barre oblique finale

La description:

Chaque webmaster peut chanter une chanson sur le problème de la barre oblique de fin sur les URL référençant des répertoires. S'ils sont manquants, le serveur renvoie une erreur, car si vous dites /~quux/fooau lieu de, /~quux/foo/ le serveur recherche un fichier nommé foo. Et parce que ce fichier est un répertoire, il se plaint. En fait, il essaie de le réparer lui-même dans la plupart des cas, mais parfois ce mécanisme doit être émulé par vous. Par exemple, après avoir effectué de nombreuses réécritures d'URL complexes dans des scripts CGI, etc.

Peut-être pourriez-vous expliquer pourquoi vous souhaitez supprimer la barre oblique de fin tout le temps?

Supprimer l' .phpextension

J'en ai besoin pour supprimer le .php

La chose la plus proche de faire cela à laquelle je puisse penser est de réécrire en interne chaque document de demande avec une extension .php, c'est-à-dire que example.com/somepage est plutôt traité comme une demande pour example.com/somepage.php. Notez que procéder de cette manière exigerait que chaque page existe réellement en tant que somepage.php sur le système de fichiers.

Avec la bonne combinaison d'expressions régulières, cela devrait être possible dans une certaine mesure. Cependant, je peux prévoir certains problèmes possibles avec les pages d'index qui ne sont pas demandées correctement et ne correspondent pas correctement aux répertoires.

Par exemple, cela réécrira correctement example.com/test en tant que requête pour example.com/test.php:

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

Mais cela fera échouer le chargement de example.com car il n'y a pas d'exemple.com/.php

Je vais deviner que si vous supprimez toutes les barres obliques de fin, alors choisir une demande d'index de répertoire à partir d'une demande de nom de fichier dans le répertoire parent deviendra presque impossible. Comment déterminer une demande pour le répertoire 'foobar':

example.com/foobar

à partir d'une requête pour un fichier appelé foobar (qui est en fait foobar.php)

example.com/foobar

Cela pourrait être possible si vous utilisiez la RewriteBasedirective. Mais si vous faites cela, ce problème devient beaucoup plus compliqué car vous allez avoir besoin de RewriteConddirectives pour vérifier au niveau du système de fichiers si la demande correspond à un répertoire ou à un fichier.

Cela dit, si vous supprimez votre obligation de supprimer toutes les barres obliques de fin et que vous forcez à la place d'ajouter des barres obliques de fin, le problème «sans extension .php» devient un peu plus raisonnable.

# 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]

Ce n'est toujours pas parfait - chaque demande de fichier a toujours .php ajouté à la demande en interne. Une demande de 'hi.txt' placera ceci dans vos journaux d'erreurs:

[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

Mais il existe une autre option, définissez les directives DefaultTypeet DirectoryIndexcomme ceci:

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

Mise à jour 2013-11-14 - Correction de l'extrait ci-dessus pour incorporer l'observation de Nicorellius

Désormais, les requêtes pour hi.txt (et toute autre chose) réussissent, les requêtes adressées à example.com/test renverront la version traitée de test.php et les fichiers index.php fonctionneront à nouveau.

Je dois donner le crédit où le crédit est dû pour cette solution car je l'ai trouvée Michael J. Radwins Blog en recherchant Google pour php sans extension apache .

Supprimer les barres obliques de fin

Certaines recherches apache remove trailing slashesm'ont amené à certaines pages d'optimisation des moteurs de recherche. Apparemment, certains systèmes de gestion de contenu (Drupal dans ce cas) rendront le contenu disponible avec et sans barre oblique finale dans URls, ce qui dans le monde du référencement entraînera une pénalité de contenu en double pour votre site. La source

La solution semble assez triviale, en utilisant mod_rewriteon réécrit à condition que la ressource demandée se termine par un /et réécrive l'URL en renvoyant l' 301 Permanent Redirecten-tête HTTP.

Voici son exemple qui suppose que votre domaine est blamcast.net et permet à la requête d'être éventuellement préfixée avec www..

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

Maintenant, nous arrivons quelque part. Permet de tout mettre ensemble et de voir à quoi il ressemble.

Obligatoire www., non .phpet pas de barres obliques de fin

Cela suppose que le domaine est foobar.com et qu'il fonctionne sur le port standard 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]

L'indicateur 'R' est décrit dans la RewriteRulesection directive. Fragment:

redirect|R [=code](forcer la redirection) Substitution de préfixe avec http://thishost[:thisport]/(qui fait de la nouvelle URL un URI) pour forcer une redirection externe. Si aucun code n'est donné, une réponse HTTP de 302 ( MOVED TEMPORARILY ) sera renvoyée.

Note finale

Je n'ai pas réussi à faire fonctionner la suppression de la barre oblique. La redirection a fini par me donner des boucles de redirection infinies. Après avoir lu de plus près la solution originale, j'ai l'impression que l'exemple ci-dessus fonctionne pour eux en raison de la configuration de leur installation Drupal. Il mentionne spécifiquement:

Sur un site Drupal normal, avec des URL propres activées, ces deux adresses sont fondamentalement interchangeables

En référence aux URL se terminant par et sans barre oblique. En outre,

Drupal utilise un fichier appelé .htaccesspour indiquer à votre serveur Web comment gérer les URL. C'est le même fichier qui active la magie des URL propres de Drupal. En ajoutant une simple commande de redirection au début de votre .htaccessfichier, vous pouvez forcer le serveur à supprimer automatiquement les barres obliques de fin.

Tim Bielawa
la source
wow merci pour tout ça. En fait, j'ai pu le faire fonctionner, il s'est avéré qu'il y avait des trucs bizarres sur mon serveur que je devais changer. Quoi qu'il en soit, maintenant au problème suivant, supprimer le .php de toutes les pages sauf une. thx man
Dirty Bird Design
J'adore voir des réponses bien pensées et organisées. Beau travail ... Une chose que j'ai remarquée: voulez-vous dire DirectoryIndex index index.html? ou DirectoryIndex index.php index.html?
nicorellius
@nicorellius pense que vous avez raison. J'ai mis à jour ma réponse originale avec votre observation.
Tim Bielawa
Je dois dire que cela ne fonctionne pas toujours. Essayez la réponse ci-dessous (de l'utilisateur 1079877)
DonJoe
Vous êtes le vrai MVP.
ZainZaheer06
45

En plus des autres réponses ci-dessus,

Vous pouvez également essayer ceci pour supprimer complètement les extensions .php de votre fichier et pour éviter une boucle infinie :

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]

Ce code fonctionnera dans Root / .htaccess, assurez-vous de changer le RewriteBase si vous souhaitez le placer dans un fichier htaccess dans le sous-répertoire.

Éditer :

Sur Apache 2.4 et versions ultérieures, vous pouvez également utiliser l'indicateur END pour éviter une erreur de boucle infinie. L'exemple suivant fonctionne de la même manière que ci-dessus sur apache 2.4,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]
Amit Verma
la source
10
Salut, merci pour ça. J'ai essayé de nombreuses solutions pour couper .php mais cela a fonctionné correctement :)
beamkiller
4
Merci! Cette édition est l'endroit où ses at, apache 2.4, apache 2.5 se retrouvent dans la boucle infinie (et seront 500) [FIN] super important
Jake Bolam
23

Le code suivant fonctionne bien pour moi:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
user1079877
la source
Cela fonctionne sauf que example.com se transforme en un index de tous les fichiers et répertoires. (Apache 2.4)
earth2jason
10

Après avoir changé le paramètre AllowOverridede Noneà Allin /etc/apache2/apache2.conf(Debian 8), après cela , le fichier .htaccess doit juste contenir:

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

Et il suffisait de cacher l'extension .php des fichiers

Rodney Salcedo
la source
J'aimerais que celui-ci soit plus haut. Pourquoi s'embêter avec la surcharge de la réécriture d'URL quand MultiViewscela est-il
Phil
C'est bien. Des inconvénients?
réformé
@reformed Merci. J'ai dû changer les liens de <a href="somepage.php">lien </a>en <a href="somepage">lien </a>dans le code source
Rodney Salcedo
8

Essayez ceci
Le code suivant fonctionnera certainement

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
la source
5

Je ne sais pas pourquoi les autres réponses n'ont pas fonctionné pour moi, mais ce code que j'ai trouvé a fonctionné:

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

C'est tout ce qui est dans mon htaccess et example.com/page montre example.com/page.php

Jon
la source
4

Pour supprimer l'extension .php d'un fichier PHP, par exemple yoursite.com/about.php vers yoursite.com/about Suivez ces étapes. Ouvrez le fichier .htaccess (créez-en un s'il n'existe pas) à partir de la racine de votre site Web et ajoutez le code suivant.

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

Pour supprimer l'extension .html d'un fichier html, par exemple yoursite.com/about.html vers yoursite.com/about Suivez ces étapes.

Ouvrez le fichier .htaccess (créez-en un s'il n'existe pas) à partir de la racine de votre site Web et ajoutez le code suivant.

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

Référence: Comment supprimer l'extension php de l'URL

Sanjeev Kumar
la source
1
La seule réponse dont j'avais besoin. Merci! :)
MatrixCow08
2

Si vous codez en PHP et que vous souhaitez supprimer .php, vous pouvez avoir une URL comme:

http://yourdomain.com/blah -> qui pointe vers /blah.php

C'est tout ce dont vous avez besoin:

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

J'ai trouvé un concept fonctionnel à 100% pour moi:

# 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]

Utilisez ce code dans la racine du fichier .htaccess de votre site Web comme:

hors ligne - wamp \ www \ YourWebDir

en ligne - public_html /

Si cela ne fonctionne pas correctement, modifiez les paramètres de votre serveur Wamp: 1) Cliquez avec le bouton gauche sur l'icône WAMP 2) Apache 3) Modules Apache 4) Cliquez avec le bouton gauche sur rewrite_module

Irshad Khan
la source
Vous ne pouvez pas avoir deux RewriteRules avec l'étiquette Lcôte à côte. [L]indique mod_rewriteque c'est la dernière règle pour le spécifié RewriteCond.
MD XF
2

Voici le code que j'ai utilisé pour masquer l' .phpextension du nom de fichier:

## 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]

Remarque: R=301est pour une redirection permanente et il est recommandé de l'utiliser à des fins de référencement. Cependant, si vous ne voulez qu'une redirection temporaire, remplacez-la parR

Rahul Gupta
la source
2

J'ai fini avec le code de travail suivant:

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

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

Si votre URL en PHP comme http://votredomaine.com/demo.php vient comme http://votredomaine.com/demo

C'est tout ce dont vous avez besoin:

créer un fichier .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Kamlesh
la source
Cela a fonctionné http://example.com/myfile mais cela n'a pas fonctionné pour http://example.com/myfolder/(fichier d'index). Pouvez-vous m'aider à le faire fonctionner pour le fichier d'index?
Wesley Gonçalves
Je pense que vous devriez essayer l'URL de réponse @starkeen ci-dessus: stackoverflow.com/a/30566026/3786343
Kamlesh
1

Essayer

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