2008-09-19 6 views
1

En ce moment je fais quelque chose comme ceci:Mod-réécritures sur apache: modifier toutes les URL

RewriteRule ^/?logout(/)?$ logout.php 
RewriteRule ^/?config(/)?$ config.php 

Je préférerais avoir une des règles qui feraient la même chose pour chaque URL, donc je n » Je dois continuer à les ajouter chaque fois que j'ajoute un nouveau fichier.

Aussi, j'aime faire correspondre des choses comme '/ config/new' à 'config_new.php' si c'est possible. Je suppose que certains regexp me permettrait d'accomplir cela?

Merci Stack Addicts!

Répondre

2

Essayez:

RewriteRule ^/(\ w +)/$ 1.php

$

$ 1 est le contenu de la première chaîne capturée entre parenthèses?. Les parenthèses autour de la 2ème barre oblique ne sont pas nécessaires.

edit: Pour l'autre match, essayez ceci:?

RewriteRule ^/(\ w +)/(\ w +)/1_ $ $ 2.PHP $

1

rewrite Mod ne peut pas faire (potentiellement) sans limites remplace comme vous voulez faire dans la deuxième partie de votre question. Mais allez voir le moteur externe Réécriture au bas du Apache URL Rewriting Guide:

externe Réécriture moteur

Description:

Une FAQ: Comment peut-on résoudre le FOO/BAR/QUUX/etc. problème? Il semble pas de solution par l'utilisation de mod_rewrite ... Solution:

Utilisez une RewriteMap externe, c'est-à-dire un programme qui agit comme une RewriteMap. Il est exécuté une fois au démarrage d'Apache reçoit les URL demandées sur STDIN et doit mettre l'URL résultante (généralement réécrite) sur STDOUT (même commande!).

RewriteEngine on 
RewriteMap quux-map  prg:/path/to/map.quux.pl 
RewriteRule ^/~quux/(.*)$ /~quux/${quux-map:$1} 

#!/path/to/perl 

# disable buffered I/O which would lead 
# to deadloops for the Apache server 
$| = 1; 

# read URLs one per line from stdin and 
# generate substitution URL on stdout 
while (<>) { 
    s|^foo/|bar/|; 
    print $_; 
} 

Ceci est un exemple de démonstration uniquement et ré-écrit que toutes les URL/~ quux/foo/... à/~ quux/bar/.... En fait, vous pouvez programmer tout ce que vous aimez. Mais notez que si de telles cartes peuvent également être utilisées par un utilisateur moyen, seul l'administrateur système peut le définir.

+0

Oh oui, je l'ai fait une fois pour supporter les sous-domaines du nom d'utilisateur;) beaucoup de plaisir. – Aeon

2

je ferais quelque chose comme ceci:

RewriteRule ^/?(logout|config|foo)/?$ $1.php 
RewriteRule ^/?(logout|config|foo)/(new|edit|delete)$ $1_$2.php 

Je préfère énumérer explicitement I de l'URL veux correspondre, de sorte que je n'ai pas à vous soucier du contenu statique ou en ajoutant de nouvelles choses plus tard que n'ont pas besoin d'être réécrites en fichiers php.

Ce qui précède est ok si tous les sous URL sont valables pour tous les URL racine (book/new, movie/new, user/new), mais pas si bon, si vous voulez avoir différents en fonction du sous URL sur l'action racine (logout/new ne fait pas beaucoup de sens). Vous pouvez gérer cela avec une regex plus complexe, ou en routant tout vers un seul fichier php qui déterminera quels fichiers inclure et afficher en fonction de l'URL.

Questions connexes