2009-12-10 7 views
1

J'utilise la directive RewriteMap de mod_rewrite pour traiter les URL. Mon programme RewriteMap est un script PHP et tout fonctionne correctement. Je suis capable de mapper les URLs amicales au programme PHP + ID. Quoi qu'il en soit, ce que je veux faire est de renvoyer une redirection 301 pour certaines URL. Par exemple, si quelqu'un met dans l'URL:301 rediriger depuis le programme mod_rewrite RewriteMap

http://www.example.com/directory1

Je veux que mon programme RewriteMap pour envoyer une redirection 301 à

http://www.example.com/directory1/ (slash)

qui va ensuite dans mon programme à nouveau être mappé sur un script PHP. J'ai essayé d'ajouter [R = 301] à la fin de ma déclaration, mais cela bloque simplement la demande. Voici la logique de base de mon script:

if ($input_url == "/directory1") { 
    echo "/directory1/ [R=301]\n";   // this doesn't work... just hangs 
} 
else if ($input_url == "/directory1/") { 
    echo "/myprogram.php?id=1\n"; 
}

Des idées?

+1

Vous mentionnez mod_rewrite, qui est un module Apache, mais vous nous montrez du code PHP. Y a-t-il une certaine confusion ici? –

+0

Oh, je pense que l'application PHP est le Rewrite prg, hein? – Cheeso

Répondre

0

Ce n'est pas possible comme vous le souhaitez. Mais vous pouvez utiliser une règle supplémentaire pour rediriger toutes les requêtes d'URL sans slash:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301] 
+0

C'est ce que j'ai fini par trouver - mais dans mon cas, ce n'est pas une option car parfois il peut s'agir d'un nom de répertoire ou parfois d'options passées. Par exemple: http://www.example.com/dir1/subdir doit 301 à: http://www.example.com/dir1/subdir/ mais http://www.example.com/ dir1/page2.html ne devrait pas être 301'd - juste réécrit en fonction des règles que j'ai configuré. Je suppose que je pourrais modifier la condition de réécriture pour rechercher toute question qui ne se termine pas par .html, mais je veux qu'elle soit flexible pour tout type de chaîne envoyée. –

+0

@Sridhar: Oui, c'est probablement la meilleure solution. Mais vous pouvez également utiliser la carte pour voir si la même requête avec une barre oblique finale sera acceptée et ensuite faire la redirection: 'RewriteCond% {mymap: $ 0 /}!^$ RewriteRule. * [^ /] $% {REQUEST_URI}/[L, R = 301] '. – Gumbo

1

Le test -d RewriteCond est conçu spécifiquement pour votre cas Sridhar. Il teste s'il y a un répertoire présent dans le système de fichiers. Si la valeur est true, ET s'il n'y a pas de barre oblique finale, vous pouvez appliquer la redirection. Ce serait comme ceci:

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301] 

Vous n'auriez pas besoin d'une RewriteMap (prg) dans ce cas.

Questions connexes