2008-12-31 9 views
2

Je viens de déployer un nouveau site en utilisant Zend Framework. En raison de la popularité de mes tutoriels, j'aimerais rediriger toute demande de tutoriel vers la page correspondante du nouveau site. Jusqu'à présent, ce que j'ai:Comment utiliser mod_rewrite avec Zend Framework?

URL

avant Rewrite: http://neranjara.org/tutorials/?tid=56

URL après Rewrite: http://neranjara.org/article/id/56

Le fichier .htaccess que je tente d'utiliser ressemble à ceci:

 
    $ cat html/.htaccess 
    RewriteEngine on 

    RewriteRule tutorials/\?tid=(.*)$ /article/id/$1 [R=301] 
    RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php 

Mais cette règle ne correspond pas à toutes les URL ...: '(

est-ce que quelqu'un voit

un problème ici 01?

Répondre

3

La chaîne de requête (les paramètres transmis à votre fichier) ne sera pas dans la RewriteRule.

Taken de http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule:

Le modèle ne correspondra pas contre la chaîne de requête. Au lieu de cela, vous devez utiliser un RewriteCond avec la variable % {QUERY_STRING}. Vous pouvez cependant créer des URL dans la chaîne de substitution , contenant une partie de chaîne de requête . Il suffit d'utiliser une marque question dans la chaîne de substitution , pour indiquer que doit être réinjecté le texte suivant dans la chaîne de requête . Lorsque vous voulez effacer une chaîne de requête existante, mettre fin à la chaîne de substitution avec juste une marque question. Pour combiner une nouvelle chaîne de requête avec une ancienne, utilisez l'indicateur [QSA] .

Vous avez deux possibilités:

  1. Retirez votre premier RewriteRule et procède à la vérification dans votre index.php à la place avant de continuer à votre cadre. La requête initiale devrait être disponible en $_SERVER['REQUEST_URI'] ou quelque chose comme ça. Donc, vérifier si elle est tutoriels, prenez le paramètre tid puis continuer avec une redirection:

    header("Location: http://http://neranjara.org/article/id/$id"); 
    exit(); 
    
  2. Utilisez RewriteCond avec% {QUERY_STRING} au lieu comme indiqué dans la documentation Apache. Cette solution est discutée dans thread comme this one.

// Edit:

Jetez un oeil à Chris' answer qui a eu la gentillesse de détailler la solution à l'aide QUERY_STRING. C'est probablement ce que vous voulez utiliser. Merci Chris.

-1

Zend utilise toute la puissance htaccess que htaccess peut fournir, il y a donc une méthode très pratique (enchaînante et intéressante et pas très bien documentée) pour réaliser ceci dans le bootstrap!

Vous devez utiliser le Zend Router dans votre bootstrap (index.php). Probablement quelque chose comme: (ce serait foo.com/article/23

routeur $ = $ frontController-> getRouter();

$ route = new Zend_Controller_Router_Route ( « article /: id », array ('id' => 1)); $ router-> addRoute ('article', $ route);

Plus d'info here

3

sur la base de vos PREVI entrée OUs:

$ cat html/.htaccess 
    RewriteEngine on 

    RewriteRule tutorials/\?tid=(.*)$ /article/id/$1 [R=301] 
    RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php 

Je suggère d'utiliser plutôt:

$ cat html/.htaccess 
    RewriteEngine on 

    RewriteCond %{QUERY_STRING} ^tid=([^&]*) 
    RewriteRule tutorials/ /article/id/%1 [R=301, L] 

    RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php [L] 

BTW, ceci est juste un exemple des nombreuses choses que vous pourriez faire en utilisant la variable QUERY_STRING dans mod_rewrite. Mon vote va à 'lpfavreau' puisque c'est l'option # 2 de leur réponse.