2009-12-30 7 views
0

J'ai un CMS de base en PHP/MySQL où les gestionnaires de contenu peuvent créer des pages sur le système pour les visualiser. Chaque page est alors disponible à un URL tel que http://www.example.com/pages.php?pid=123 Maintenant, je veux rediriger les demandes vers http://www.example.com/pages.php?pid=123 à http://www.example.com/pages.php?pid=456..htaccess 301 rediriger ne fonctionne pas

J'ai déjà supprimé la page pid=123 de la base de données mais à cause du code cms, le site renvoie toujours un 202 lorsque quelqu'un tente d'accéder à la page. Je pensais que je pouvais utiliser une redirection 301 à .htaccess pour faire fonctionner redirect, i.e. .:

redirect 301 pages.php?pid=123 http://www.example.com/pages.php?pid=456 

mais cela ne fonctionne pas, Apache retourne encore 202 en essayant de récupérer le pid = 123 page. De plus, je l'ai essayé d'utiliser mod_rewrite, mais il ne fonctionne pas:

RewriteRule ^pages.php?pid=123$ pages.php?pid=456 [R=301,L] 

Toutes les idées ce qui pourrait être mal et comment je peux résoudre la redirection 301?

+0

URLs mangés en raison de la détection stupide de spam de SO – Evenz495

+0

Essayez RewriteRule^pages.php \? Pid = 123 $ pages.php? Pid = 456 [R = 301, L] (échapper le point d'interrogation). Juste une supposition. –

+0

Ivan, désolé, mais n'a pas fonctionné. Toujours obtenir 202 et pas de redirection. – Evenz495

Répondre

0

Vous pouvez effectuer la redirection en PHP (qui sait probablement plus sur quoi rediriger où) en utilisant header().

Veuillez noter que ? est un caractère spécial utilisé par les expressions régulières, donc votre expression régulière correspond à pages.phppid=123 et pages.phppid=123.

Même alors, je ne pense pas la chaîne de requête (y compris la partie ?pid=123) est utilisée dans l'URL traitée par RewriteRule, vous devez utiliser quelque chose comme:

RewriteCond %{QUERY_STRING} ^pid=123$ 
RewriteRule ^pages.php$ pages.php?pid=456 [R=301,L] 

Cela ne devrait pas Travaillez tel quel, mais cela devrait vous donner quelques idées.

+0

Merci pour les commentaires. J'ai déjà fixé le '?' partie par Ivan Krechetov suggestion. La règle de réécriture que vous suggérez n'a malheureusement pas fonctionné, encore 202 et aucune redirection. – Evenz495

1

Les deux Redirect et RewriteRule directive fonctionnent uniquement sur URL path. Dans mod_alias (Redirect directive) vous ne pouvez pas tester la requête et dans mod_rewrite (RewriteRule directive) vous avez besoin d'un RewriteCond directive supplémentaire:

RewriteCond %{QUERY_STRING} (^|&)pid=123(&|$) 
RewriteRule ^pages\.php$ /pages.php?pid=456 [R=301,L] 

Mais il serait certainement mieux si votre CMS peut gérer ces redirections car il est votre CMS sait mieux quelles URL sont valides et quelles ne sont pas.

+0

Merci pour les commentaires. J'ai essayé la réécriture ci-dessus mais cela ne fonctionne pas. Toujours obtenir 202 et aucune redirection, seulement une page qui charge le modèle PHP par défaut. – Evenz495

+0

@ Evenz495: Utilisez-vous d'autres règles qui pourraient entrer en conflit avec celle-ci? – Gumbo

+0

Cette réponse est en or. Si vous savez que RewriteRule et Redirect ne fonctionnent pas sur les chaînes de requête, tout se met soudainement en place et les redirections Apache sont à nouveau faciles. Et une heure de lutte avec RewriteRule essayant de traiter les chaînes de requête ne semble pas beaucoup. –