web-dev-qa-db-fra.com

Comment supprimer les barres obliques de fin d'URL avec .htaccess?

La situation

Sur l’ensemble du domaine, nous aimerions que les URL cachent les extensions de fichier et suppriment les barres obliques , indépendant du nom de domaine lui-même (comme dans, fonctionne sur n'importe quel domaine).

Exemple de notre structure de répertoire

Nous n'utilisons pas de fichiers index. * À l'exception de la page d'accueil.

  • /
    • /index.php
    • /account.php
    • /Compte
      • /subscriptions.php
    • /login.php
    • /s'identifier
      • /reset-password.php

Le but

Quelques exemples de la manière dont ces fichiers peuvent être demandés et à quoi ils devraient ressembler dans le navigateur:

  • / et index.php -> mydomain.com (littéralement le nom de domaine nu).

  • /account.php ou /account/ ou /account -> mydomain.com/account

  • /account/subscriptions.php ou /account/subscriptions/ ou /account/subscriptions -> mydomain.com/account/subscriptions

Comme vous pouvez le constater, chaque page Web peut être accédée de plusieurs manières. Toutefois, quelle que soit l’une des 2 ou 3 méthodes que vous utilisiez pour y accéder, celle-ci n’affiche que l’URL de votre choix dans le navigateur.

La question

Comment est-ce fait avec .htaccess en utilisant mod_rewrite?

Je me suis cogné la tête contre le mur pour essayer de comprendre, mais en général, le flux de réécriture semble être quelque chose comme ceci:

  1. Redirection externe 301 (mydomain.com/account/ -> mydomain.com/account)
  2. Ajoutez en interne .php (mydomain.com/account -> mydomain.com/account.php)

J'ai été sur Google pendant toute la journée, j'ai lu des milliers de lignes de documentation et de textes de configuration, et j'ai essayé plusieurs dizaines de fois ... Je pense qu'un plus grand nombre de cerveaux sur cela aiderait beaucoup.

METTRE À JOUR

Nous avons trouvé une réponse à notre question (voir ci-dessous).

7
Matt

Merci de votre temps pour examiner la question, mais nous semblons l'avoir compris:

Options -Multiviews -Indexes +FollowSymLinks
RewriteEngine On
RewriteBase /
DirectorySlash Off

# remove trailing slash
RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]

# rewrite /dir/file?query to /dir/file.php?query
RewriteRule ^([\w\/-]+)(\?.*)?$ $1.php$2 [L,T=application/x-httpd-php]

Nous devons désactiver les vues multiples et les index pour éviter toute confusion du moteur et essayer plutôt de référencer un fichier index.* ou d'afficher une liste de répertoires (également appelé "index" avec Apache ...) lorsqu'un répertoire semble être demandé.

La première redirection visible (R=301) supprime la barre oblique finale et la seconde la réécrit en interne dans le fichier PHP (ou HTML, etc.).

Ce fichier .htaccess prend également en charge les chaînes de requête.

Mise à jour Comme noté dans les commentaires ci-dessous beaucoup plus tôt, nous avons basculé vers nginx, et voici tous nos fichiers de configuration contenant des informations sur la réécriture d'URL (à partir de ma boîte de dev):

location = / {
    index index.html;
}

try_files $uri $uri.html =404;

Nous sommes également passés de PHP à simplement du HTML, mais la modification des extensions ci-dessus ne devrait guère faire la différence, voire pas du tout.

7
Matt

Pourquoi voulez-vous rediriger/compte sur /account.php? En fait, la page/le compte existe uniquement avec négociation de conten . Si vous ne le souhaitez pas, désactivez simplement la directive.

À propos de vos deux règles, je pense que cela est simple:

RewriteRule ^/account/$ /account
RewriteRule ^/account$ /account.php [R,L]

Il n'a pas encore été testé. Vous pouvez également ajouter [R,L] à la première ligne. Dans ce cas, le navigateur effectuera une redirection supplémentaire.

0
jcisio

Si vous souhaitez un moyen simple et flexible d'acheminer les demandes d'URL pour votre site Web ou votre application, je vous recommanderais un micro-framework PHP. Non seulement vous aurez un contrôle total sur votre routage d'URL, mais cela apportera également d'autres avantages.

J'ai déjà utilisé le Slim Framework auparavant, associé au composant de modélisation de Symfony , avec d'excellents résultats. Si je devais le refaire, j'utiliserais probablement simplement le Silex Micro-framework , car il fait également partie des composants Symfony.

0
Kevin C.