2009-04-07 4 views
1

Je suis assez nouveau mod_rewrite et je tente de convertir une URL deComment créer un remplacement récursif dans mod_rewrite?

http://example.com/foo/bar/blah/etc.html 

dans

http://example.com/stuff/foo_bar_blah_etc.html 

L'hypothèse est qu'il n'y a pas de numéro de série de répertoires entre le domaine et le nom de fichier, donc je ne peux pas écrire une seule règle de réécriture avec 3 espaces réservés. Je pourrais éventuellement créer 5 ou 6 règles avec zéro à 5 placeholders mais j'ai le sentiment qu'il y a une meilleure façon. Quelqu'un pourrait m'aider avec ça?

Répondre

1

Essayez ceci:

RewriteRule (.*)/(.+) $1_$2 [NS] 
RewriteRule (.*) stuff/$1 [NS] 
+0

Merci pour la réponse rapide. Une fois que j'ai l'occasion de le tester, j'accepterai votre réponse. – martinatime

+0

Ce que j'ai posté à l'origine ne fonctionne pas, j'ai peur. Je l'ai édité à quelque chose que les tests montrent plus fonctionnel. – chaos

+0

Je pense que vous vouliez utiliser [N] pour les drapeaux de la première ligne. – martinatime

4

Je pense que vous pouvez faire pour remplacer une barre oblique à la fois avec un trait de soulignement:

RewriteRule ^/(.+)/(.*?)$ /$1_$2 [N] 
RewriteRule ^.*$ /stuff$0 

Le drapeau [N] provoque Apache pour relancer le processus de réécriture d'URL à partir la première règle. Si vous avez d'autres règles qui s'appliquent à l'URL avant ces deux, n'oubliez pas qu'elles seront également invoquées à chaque itération. Une alternative, qui peut être plus efficace ou non, consisterait à utiliser un programme externe pour gérer la réécriture. Vous mettriez cela dans votre fichier de configuration Apache (au lieu de ce qui précède)

RewriteMap slashtouscore prg:/usr/local/bin/slashtouscore.pl 
RewriteRule ^/(.*)$ /stuff${slashtouscore:$1} 

et alors vous aurez besoin pour créer le script exécutable /usr/local/bin/slashtouscore.pl avec le contenu

#!/usr/bin/perl 
$| = 1; 
while (<>) { 
    s|/|_|g; 
    print; 
} 

(Il ne doit être un script Perl, bien sûr, tout programme ayant la même fonction le fera - et bien sûr le nom de fichier peut être ce que vous voulez, tant qu'il est accessible à Apache)

Notez que rien de tout cela n'a été testé.

+0

Merci pour la réponse complète. – martinatime

Questions connexes