Comment puis-je rediriger tous les sous-répertoires à la racine à l'aide htaccess ou httpd.conf?
J'ai un fichier d'index qui crée du contenu sur la base n PATH_INFO variables.
Exemple:
site.com/A/B/n/
doit utiliser index.php soit:
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 variations de:
RedirectMatch ^/.+/.*$ /
sans succès.
J'ai un inconfort et infranchissables solution 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 infranchissables, nécessite de ligne manuel pour chaque sous-répertoire
- Échoue avec des caractères non alphanumériques (principalement +,= et &) ex. site.com/ab&c/de+f/
(remarque, même en changeant l'expression régulière ^([a-zA-Z0-9_-\+\=\&]+)/?$ fait peu pour aider et rend vraiment d'erreur entièrement)
Pouvez-vous aider?
Alors .. qui préférez-vous:
Je suis pour. Tout étant égal, je préfère celui avec une seule ligne.
site.com/index.php?var1=A&var2=B&varN=n
(nécessite plusieurs règles) ou site.com/index.php/A/B/n/
(peut être fait avec une seule règle) ?Je suis pour. Tout étant égal, je préfère celui avec une seule ligne.
OriginalL'auteur Ryan | 2011-07-29
Vous devez vous connecter pour publier un commentaire.
Option 1: (
site.com/index.php?var1=A&var2=B&varN=n
):1. Vous avez eu
[NC]
drapeau ... donc il n'y avait pas besoin d'avoirA-Z
dans votre modèle.2. Au lieu de
[a-zA-Z0-9_-\+\=\&]
ou[a-zA-Z0-9_-]
- je utiliser[^/]
qui signifie n'importe quel caractère sauf slash /.3.
[QSA]
drapeau a été ajouté pour préserver la chaîne de requête.Option 2: (
site.com/index.php/A/B/n/
):En réalité, si vous ne prévoyez pas de montrer que l'URL de n'importe où (comme, redirection 301 etc), la dernière ligne peut être facilement remplacée par
RewriteRule .* index.php [L]
-- vous recherchez les URL d'origine à l'aide de$_SERVER['REQUEST_URI']
dans votre code PHP de toute façon.que dois-je faire si j'ai un sous-répertoire dans le rott répertoire avec le même nom que l'url? permet de dire que je souhaite l'accès "www.domain.com/preferences" mais j'ai des préférences de dossier
Vous devez l'ajouter à la "liste d'exclusion" (supplémentaires) comme il va/doit le traiter comme l'accès à un dossier existant par
RewriteCond %{REQUEST_FILENAME} !-d
partieEt comment puis-je créer cette condition/liste d'exclusion?
Vous mieux créer une autre question dans la description de votre situation. Droit maintenant, je n'ai pas accès à tous les serveurs Apache pour vérifier mes idées (et j'en ai besoin car je n'ai pas utilisé Apache pour quelques mois et je ne veux pas vous donner de mauvais conseils -- n'ont pas été répondre à de telles htaccess/Apache questions depuis plus d'un an maintenant -- besoin de certains environnement de test pour vérifier mes pensées/idées avant répondeur).
OriginalL'auteur LazyOne
L'ajout de la suivante permet de rediriger tout le trafic (pour les fichiers qui n'existent pas) vers la page d'index:
Ensuite, vous pouvez prendre votre décision en index.php par l'analyse de la 'REQUEST_URI'
si la demande de nom de fichier est différent de -f (fichier) ou-d (répertoire)
OriginalL'auteur Scripty
RewriteRule ^/.+ /[R=301,L]
une url avec n'importe quel type de chemin au-delà de la racine sera redirigé vers la racine.
OriginalL'auteur Or Gal