2010-10-24 7 views
0

Je suis sur le point de mettre à jour mon site pour utiliser CakePHP à la place d'un ancien framework homegrown. J'ai besoin d'écrire le fichier HTAccess pour rediriger les anciennes URL de paramètres PHP vers les nouvelles URL conviviales de CakePHP SEO, mais je n'arrive pas à le faire fonctionner.Rediriger/.htaccess pour modifier les anciennes URL de paramètres PHP en URL CakePHP conviviales?

Mon fichier htacess (l'une dans l'application/Webroot) ressemble à ceci au moment:

RewriteEngine On 

RewriteRule ^index.php?action=view&item=172$ index.php?url=item/172 [R=301,L] 

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

Il ne fonctionne pas. J'ai essayé d'enlever le L et de le rediriger juste vers l'item/172, mais ça n'a pas marché non plus. L'actuel se termine avec le paramètre d'URL unset, et si je regarde dans $ _SERVER ['REQUEST_URI'] il est inchangé. Bien que je ne sache pas si mod_rewrite changerait cela. Ma règle de réécriture ne semble pas être activée, même si elle est directement copiée depuis la barre d'adresse de mon navigateur. Je l'ai essayé sans out et avec un leader /. Pas de dé.

Que se passe-t-il ici?

Et comment puis-je écrire une URL plus généralisée pour faire la conversion? J'ai essayé quelque chose comme:

RewriteRule ^index.php?action=view&item=([0-9]+)$ index.php?url=items/$1 [R=301,L]  

Mais cela n'a pas fonctionné non plus. Qu'est-ce que je fais mal?

EDIT Ceci est positivement exaspérant.

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301] 

Cela fonctionne. Il entonne toutes les URLs dans cette URL de Cake correctement formée. Quel processeur de gâteau prend alors et gère en quelque sorte. Je ne sais pas à quel point la deuxième règle de réécriture de Cake lui manque, mais c'est le cas. Essayer ceci:

RewriteRule ^(.*)$ item/172 [R=301] 

Renvoie une redirection malformé, comme ne spécifiant dernier sur le précédent:

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301,L] 

qui déclare qu'il ne pourrait jamais complète.

Je suis en fait assez déconcerté la raison pour laquelle celui-ci:

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301] 

Renvoie l'URL correcte Cake, mais il fait et il est envoyé à la bonne page. Cependant, dès que je tente de changer la première partie, elle commence à échouer.

Attendez une seconde. C'est quand il atteint le ? qu'il commence à échouer. Il correspond avec succès index.php mais pas index.php? Mais s'échapper ne fait aucune différence.

RewriteRule ^index.php\?$ /index.php?url=item/172 [R=301] 

Échec de correspondance ou de renvoi de l'URL correcte. Et il ne semble pas non plus correspondre à la capture normale de Cake, car $_GET['url'] est vide. Comment échappez-vous aux caractères de paramètre pour correspondre littéralement dans mod_rewrite?

+0

GAH! Qu'est-ce que le * & @ $ & est faux avec mod-rewrite? J'ai eu ce travail pendant environ 30 secondes, ajouté une autre règle de réécriture et il a cessé de fonctionner à nouveau! Je supprime l'autre règle de réécriture et son ne fonctionne toujours pas! Que diable? –

Répondre

4

Avec RewriteRule vous ne pouvez tester le chemin URI, mais pas la requête:

Le Motif sera d'abord comparé contre la partie de l'URL après le nom d'hôte et le port, et avant la chaîne de requête. Si vous souhaitez faire correspondre le nom d'hôte, le port ou la chaîne de requête, utilisez un RewriteCond avec les variables %{HTTP_HOST}, %{SERVER_PORT} ou %{QUERY_STRING} respectivement.

Alors:

RewriteCond %{QUERY_STRING} ^action=view&item=([0-9]+)$ 
RewriteRule ^index\.php$ /index.php?url=item/%1 [R=301,L] 
+0

Merci! C'est ce qu'il a fait. D'une façon ou d'une autre, dans toutes mes lectures et mes recherches, cela n'a jamais été mentionné ou est apparu. Et il ne m'est jamais venu à l'esprit que la chaîne de requête serait séparée de l'URL principale. –

Questions connexes