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:
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