2009-12-29 4 views
0

Je ces rewriterules qui fonctionnent bien:mod_rewrite: comment pointer vers un fichier différent mais conserver les variables de requête?

# 4 params 
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2&what=$3&id=$4 [NC,L,QSA] 

# 3 params 
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2&what=$3 [NC,L,QSA] 

# 2 params 
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2 [NC,L,QSA] 

# 1 param 
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?app=$1 [NC,L,QSA] 

Maintenant, je voudrais que si l'URL contient /api/ alors je voudrais pour pointer vers un fichier appelé public.api.php mais encore les 4 requête vars en tant que paramètres. Je pourrais organiser cela en explicitant toutes les règles dans l'ordre dans lequel elles devraient être traitées, mais cela fait un assez long fichier .htaccess.

Mes questions est la suivante: est-il un moyen d'ajouter une sorte de règle conditionnelle qui vérifierait si /api/ est dans le uri demandé et selon ce point à index.php ou public.api.php sans répéter le traitement des quatre requêtes vars?

Répondre

1

Le plus simple serait si vous ajoutez simplement quelques règles comme:

RewriteRule ^api/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ public.api.php?app=$1&do=$2&what=$3&id=$4 [NC,L,QSA] 
RewriteRule ^api/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ public.api.php?app=$1&do=$2&what=$3 [NC,L,QSA] 
RewriteRule ^api/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ public.api.php?app=$1&do=$2 [NC,L,QSA] 
RewriteRule ^api/([A-Za-z0-9-]+)/?$ public.api.php?app=$1 [NC,L,QSA] 

Modifier Voici une autre approche:

RewriteRule (^|.+?/)api/?([^/].*)?$ $1$2 

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2&what=$3&id=$4 [NC,L,QSA] 
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2&what=$3 [NC,L,QSA] 
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2 [NC,L,QSA] 
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?app=$1 [NC,L,QSA] 

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?\ ]+/)?api/? 
RewriteRule ^index\.php$ public.api.php [L] 
0

Juste échapper le? et capturer tous les paramètres en tant que groupe?

RewriteRule ^.*/api/.*\?(.*)$ /public.api.php?$1 [NC,L,QSA] 
+0

Pouvez-vous préciser? Je ne suis pas sûr de comprendre la logique que vous proposez. – pixeline

+0

Il suffit de copier sur chaque paramètre de requête, tous correspondent dans un groupe, comme esquissé dans ce RewriteRule ci-dessus, qui n'est pas vraiment testé. – fforw

+0

Votre expression rationnelle n'échappe pas au? ce qui signifie "n'importe quel caractère une fois" dans regexp-ish. – fforw

Questions connexes