2011-08-03 4 views
0

Je suis en train de faire quelque chose de semblable à $ _SERVER [ « PATH_INFO »] mais des problèmes étranges de serveur me empêchez de l'utiliser ...répertoires, fichiers .htaccess et les variables

Dans mon application, les liens peuvent ressembler

www.domain.com/folder/file/variable 
www.domain.com/folder/file 
www.domain.com/file/variable or 
www.domain.com/file/ 

Avec .htaccess, je suis en train de se rendre aux pages appropriées, et de ne pas rediriger le index.php ou similaire.

Jusqu'à présent, j'ai ce qui ne fonctionne pas :)

RewriteRule ^(.+)$ /$1.php # page only 
RewriteRule ^(.+)/(.+)$ /$1.php?x=$2 # page + variable 
RewriteRule ^(.+)/(.+)$ /$1/$2.php # folder/page 
RewriteRule ^(.+)/(.+)/(.+)$ /$1/$2.php?x=$3 # folder/page + variable 

Je suis sûr que je dois utiliser RewriteCond% {} REQUEST_FILENAME -f pour vérifier si la demande est un nom de fichier ou répertoire. .. mais je ne pouvais pas le faire fonctionner ...

Les variables peuvent contenir tous les caractères étranges - c'est pourquoi je fais correspondre avec le point ... Peut-être que je devrais essayer de faire correspondre les noms de fichiers/dossiers avec az seulement (depuis je ne pense pas qu'ils contiendront jamais autre chose que az, _ ou -).

Toute aide est grandement appréciée, depuis ses presque deux jours d'agonie maintenant :)

+1

1) En raison du motif que vous utilisez commencez par un motif plus long d'abord comme '^ (. +) $' Correspondra '/ fichier /' ainsi que '/ fichier/variable' ainsi que'/dossier/fichier/variable » 2) Utilisez '([^ /] +)' au lieu de '^ (. +) $' - cela vous aidera # 1 – LazyOne

Répondre

0

grâce à l'indice @ LazyOne, j'ai été en mesure de résoudre ce problème.

fichier htaccess ressemble maintenant quelque chose comme ceci:

RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)$ /$1/$2.php?x=$3 
RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)/$ /$1/$2.php 
RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)$ /$1.php?x=$2 
RewriteRule ^([-a-zA-Z0-9_]+)/$ /$1.php 

tous les dossiers ou fichiers chemins doivent se terminer par «/», tandis que la variable ne doit pas. Ce n'est pas un problème dans mon cadre - mais peut-être pas utile pour les autres.

1

Inverser la règle Réécrire le plus spécifique au premier.

RewriteEngine On 
RewriteRule ^(.+)/(.+)/(.+)$ /$1/$2.php?x=$3 [L] 

# RewriteRule to check that the file is exists here 
RewriteCond %{REQUEST_URI} ^(.+)/(.+)$ 
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI}.php -f 
RewriteRule ^(.+)/(.+)$ /$1/$2.php [L] 

# If file is not exists, then check by put to the variable 
RewriteRule ^(.+)/(.+)$ /$1.php?x=$2 [L] 
RewriteRule ^(.+)$ /$1.php [L] 
+0

Oui, oui, désolé de ne pas entrer dans les détails, tout est là, RewriteEngine On , etc ... ma configuration htaccess fonctionne essentiellement, mais seulement pour un cas à la fois. Si je commente toutes les lignes sauf une, et que je clique sur l'URL correspondante, cela fonctionne. – dvdbrk

0

La plupart des personnes/frameworks transmettent tout ce qui n'a pas d'extension spécifiée à un contrôleur frontal php qui détermine ensuite ce qu'il faut faire. Je pense que l'une des raisons pour lesquelles la plupart des gens optent pour cette voie est simplement à quel point mod_rewrite est complexe!

Questions connexes