web-dev-qa-db-fra.com

Comment supprimer des dossiers de sous-répertoires de l'URL à l'aide de htaccess

J'essaie de supprimer les sous-dossiers de l'URL de mon site.

Vous trouverez ci-dessous la structure de mes dossiers. Je ne sais pas où placer mon fichier .htaccess ni quoi y écrire:

  • mysiteroot
    • sousdir1
    • subdir2
      • index.php
      • page1.php
      • page2.php
      • page3.php

J'ai écrit ce qui suit:

RewriteEngine On
RewriteRule ^$ subdir1/subdir2/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ subdir1/$1

Il semble que cela ne fonctionne que pour l'index avec mon fichier .htaccess placé dans le dossier mysiteroot.

Comment puis-je demander à page1.php d'afficher www.mysiteroot.com/page1 au lieu de www.mysiteroot.com/subdir1/subdir2/page1.php?

2
A-ndy

J'avais déjà écrit la majeure partie de ceci avant de poster votre solution. Publier de toute façon une solution plus générale que les lecteurs pourraient trouver utile.


Comment puis-je demander à page1.php d'afficher www.example.com/page1 au lieu de www.example.com/subdir1/subdir2/page1.php?

Pour ce faire, vous modifiez physiquement les URL dans votre application et non dans .htaccess. Une fois que les URL ont été modifiées dans votre application, la demande concerne alors www.example.com/page1, l'URL visible affichée à vos utilisateurs (et non page.php). Vous utilisez ensuite mod_rewrite dans .htaccess pour réécrire en interne l'URL visible dans le chemin d'accès réel/caché du système de fichiers: /subdir1/subdir2/page1.php. (Mais je soupçonne que vous le savez déjà, puisque votre code est correct.)

Dans votre diagramme de hiérarchie de fichiers, vous semblez afficher subdir2 au même niveau que subdir1? Cependant, votre structure de code et d'URL suggère que subdir2 est un sous-répertoire de subdir1. Je vais assumer le plus tard.

Vous devez essentiellement faire deux choses:

  1. Réécrivez toutes les demandes dans /subdir1/subdir2/ (à l'exception des demandes mappées directement sur des fichiers ou des répertoires).

  2. Ajoutez l’extension de fichier .php aux demandes qui ne l’ont pas déjà.

Essayez quelque chose comme ce qui suit dans le fichier .htaccess à la racine du document, c.-à-d. mysiteroot/.htaccess.

RewriteEngine On

# If the request has already been rewritten
# Or maps to an existing file then stop here.
# (Can't test for dir here since would not rewrite the doc root)
RewriteCond %{ENV:REDIRECT_STATUS} . [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# No file extension on request then append .php and rewrite to subdir
RewriteCond %{REQUEST_URI} /(.+)
RewriteRule !\.[a-z0-4]{2,4}$ /subdir1/subdir2/%1.php [NC,L]

# All remaining requests simply get rewritten to the subdir
RewriteRule (.*) /subdir1/subdir2/$1 [L]

Toute demande de /path/to/file (qui ne mappe pas directement dans un fichier) obtient récrit en interne dans /subdir1/subdir2/path/to/file.php.

La première directive RewriteCond garantit que nous ne réécrivons pas les demandes déjà réécrites dans le sous-répertoire, empêchant ainsi une boucle de réécriture.

1
MrWhite

J'ai trouvé la solution qui correspond à ce que je voulais faire. Les internautes fournissent une réponse par génération, mais le problème est que je n'ai pas l'intention d'utiliser les mêmes noms de page sans extensions pour faire référence à mes pages. Cela signifie que je garde un fichier avec la liste des pages principales.

Voici les détails de ma solution: - Placez le fichier htaccess dans mon dossier racine. - Reportez-vous aux pages des sous-répertoires en utilisant une référence absolue.

contenu du fichier htaccess:

RewriteEngine On
Options -Indexes #prevents access to folders
RewriteRule ^page1?$ ./subdir2/page1.php
RewriteRule ^page2?$ ./subdir2/page2.php

Avec cela, toutes les pages de htaccess fonctionneront comme si elles étaient dans le répertoire racine. Donc, si vous devez appeler une page qui n'est pas une page principale et qui se trouve dans un sous-dossier, reportez-vous à ce moment-là en partant du dossier racine.

Des solutions simples fonctionnent mieux parfois

1
A-ndy