2010-12-09 5 views
0

J'ai des problèmes avec la réécriture d'URL dynamiques en utilisant .htaccess. La réécriture devrait être assez simple, mais il me manque quelque chose et apprécierait grandement une main.Réécriture d'URL dynamique en utilisant .htaccess

Le schéma d'URL:

http://www.example.com/index.php?p=/category/page-slug 

devrait se traduire par:

http://www.example.com/category/page-slug 

Et

http://www.example.com/index.php?p=/category/&f=feed/rss 

devrait devenir:

http://www.example.com/category/feed/rss 

Ma règle actuelle est de réécriture:

RewriteRule ^(.+)?$ index.php?p=$1 [NC,L] 

mais qui ne fonctionne pas comme il se doit. Aucune suggestion?

Modifier: Cette règle travaille maintenant en partie comme il charge la page, mais aucun des actifs de la page comme mes feuilles de style et les images sont visibles. Je suppose que c'est parce que ce sont des chemins relatifs. Des idées sur une solution de contournement?

RewriteRule ^([a-zA-Z0-9-/+]+)$ http://example.com/index.php?p=/$1 [L] 
+0

Je ne suis pas l'obtenir. Voulez-vous que le lien ci-dessus devienne le lien du bas ou voulez-vous que le lien du bas devienne le lien principal? – lolraccoon

+0

Les URL propres sans les paramètres sont ce que j'essaie d'atteindre. – VirtuosiMedia

+0

Je pense que la question de lolraccoon concerne l'URL qui devrait apparaître dans le navigateur et celle qui devrait être réécrite pour le serveur. Habituellement, nous voulons que l'un sans les paramètres soit ce que l'utilisateur tape. Ensuite, quand mod_rewrite l'exécute "devrait devenir" la version avec les paramètres. C'est ce que tu veux dire? – bmb

Répondre

0

les opérations suivantes:

RewriteRule ^index.php?p=(.*)&f=(.*)$ /$1$2 [NC,L] 
RewriteRule ^index.php?p=(.*)$ /$1 [NC,L] 
+0

Merci pour l'aide. J'ai essayé quelques variantes de votre code, mais ce n'est pas encore le cas. D'autres idées? – VirtuosiMedia

1

Vos actifs de la page ne se chargent pas parce que les URL pour eux sont réécrites aussi.

Par exemple, une règle comme

RewriteRule ^(.*)$ index.php?p=$1 [NC,L] 

une demande de

http://www.example.com/images/logo.gif 

sera réécrite à

http://www.example.com/index.php?p=/images/logo.gif 

Une façon courante d'éviter cela est d'éviter les demandes de les vrais fichiers de correspondre à la règle. Cela se fait habituellement en mettant ces deux déclarations RewriteCond au-dessus de votre règle:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?p=$1 [NC,L] 

Le !-f ne signifie pas un fichier et !-d signifie pas un répertoire.

Ensuite, vous aurez besoin d'une règle différente pour faire correspondre l'URL avec le f=. La réponse de lolraccoon a une bonne suggestion, mais je pense qu'il a inversé la façon dont vous le voulez.

Comment votre règle saura-t-elle que le paramètre f= est nécessaire? Si elle est basée sur la présence du mot feed dans l'URL, vous pouvez essayer quelque chose comme ça (mais utiliser les !-f et !-d condtions là aussi):

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*/)(feed.*)$ index.php?p=/$1&f=$2 
+0

Merci pour l'explication détaillée, bmb. J'ai tout fonctionne maintenant, sauf pour les flux. Il existe trois valeurs possibles pour le paramètre f: feed, feed/rss et feed/atom. En outre, les caractères génériques ne semblent pas fonctionner pour les pages pour une raison quelconque, mais cela fonctionne si je définis des caractères explicites:^([a-zA-Z0-9 -/+] +) $ index.php? P =/$ 1 [L] – VirtuosiMedia