Comment puis-je redirect tous les sous-répertoires vers root en utilisant htaccess ou httpd.conf?

J’ai un fichier d’index qui crée du contenu basé sur n variables PATH_INFO.

Exemple:

site.com/A/B/n/ 

devrait utiliser index.php à:

 site.com/index.php?var1=A&var2=B&varN=n - or - site.com/index.php/A/B/n/ 

au lieu de:

 site.com/A/B/n/index.php || which doesn't exist || 

Jusqu’à présent, j’ai essayé un certain nombre de variantes de:

 RedirectMatch ^/.+/.*$ / 

sans succès.

J’ai une solution inélégante et insaisissable ici:

 RewriteEngine On RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?p1=$1 [NC,L] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2 [NC,L] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [NC,L] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [NC,L] 

Problèmes avec cette solution:

  • Inélégant et impossible à convertir, nécessite une ligne manuelle pour chaque sous-répertoire
  • Échec avec des caractères non alphanumériques (principalement +, = et &) ex. site.com/ab&c/de+f/ (note, même changer le regex à ^ ([a-zA-Z0-9_- \ + \ = \ & ] +) /? $ fait peu pour aider et rend effectivement l’erreur dehors entièrement)

Pouvez-vous aider?

Option 1: ( site.com/index.php?var1=A&var2=B&varN=n ):

 Options +FollowSymLinks -MultiViews RewriteEngine On # do not do anything for already existing files RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule .+ - [L] RewriteRule ^([^/]+)/?$ index.php?p1=$1 [QSA,L] RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2 [QSA,L] RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [QSA,L] RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [QSA,L] 

1. Vous aviez un drapeau [NC] … il n’était donc pas nécessaire d’avoir AZ dans votre pattern.

2. Au lieu de [a-zA-Z0-9_-\+\=\&] ou [a-zA-Z0-9_-] j’utilise [^/] qui signifie n’importe quel caractère sauf barre oblique / .

3. Le drapeau [QSA] a été ajouté pour préserver la chaîne de requête existante.

Option 2: ( site.com/index.php/A/B/n/ ):

 Options +FollowSymLinks -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php/$1 [L] 

En réalité, si vous ne prévoyez pas d’afficher cette URL n’importe où (comme la redirection 301, etc.), la dernière ligne peut facilement être remplacée par RewriteRule .* index.php [L] – vous allez rechercher l’URL d’origine en utilisant $_SERVER['REQUEST_URI'] dans votre code PHP de toute façon.

L’ajout de ce qui suit redirecta tout le trafic (pour les fichiers qui n’existent pas) vers la page d’index:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*) index.php [NC] 

Ensuite, vous pouvez prendre votre décision dans index.php en analysant le ‘REQUEST_URI’

RewriteRule ^ /. + / [R = 301, L]

toute URL avec n’importe quel chemin d’access au-delà de root sera redirigée vers root.

 ^ = start of url / = a slash .+ = 1 or more characters