Rediriger les URL avec des chaînes de requête dans .htaccess

J’essaie de migrer un ancien site vers un nouveau site construit avec concrete5. L’ancien site utilise des chaînes de requête que je ne peux pas redirect depuis Concrete5.

  1. Il existe plusieurs catégories, comment puis-je redirect uniquement la partie requête?

    • Ancienne URL: example.com/portfolio/category?cat=hifi
    • Nouvelle URL: example.com/projecten/hifi
  2. De plus, j’ai des URL avec une requête différente nécessitant également des redirections:

    • Ancienne URL: example.com/portfolio/post.php?s=pagename-xxx-xxx
    • Nouvelle URL: example.com/projecten/pagename-xxx-xxx

Aide très appréciée!

Vous devrez utiliser mod_rewrite et une condition ( RewriteCond ) correspondant à la variable de serveur QUERY_STRING .

Essayez ce qui suit dans votre fichier racine .htaccess au- dessus des directives mod_rewrite existantes.

 RewriteEngine On # PART 1 : Redirect old category URLs RewriteCond %{QUERY_STRING} ^cat=(\w+) RewriteRule ^portfolio/category$ /projecten/%1? [R=302,L] # PART 2 : Redirect other old URLs RewriteCond %{QUERY_STRING} ^s=(pagename-\w{3}-\w{3}) RewriteRule ^portfolio/post\.php$ /projecten/%1? [R=302,L] 

Cela suppose que les xxx dans le nom de la pagename-xxx-xxx sont 3 caractères littéraux (c.-à-d. az , AZ , 0-9 ou _ ).

MISE À JOUR # 1: La fin ? sur la substitution RewriteRule est nécessaire pour supprimer la chaîne de requête de la cible. Ou utilisez l’indicateur QSD sur Apache 2.4+.

Modifiez la redirection 302 (temporaire) vers 301 (permanent) lorsque vous êtes sûr que cela fonctionne correctement. Les redirections 301 sont mises en cache par le navigateur, ce qui peut rendre le test problématique.

MISE À JOUR # 2: En ce qui concerne l’URL mise à jour dans “PART 2”, essayez plutôt:

 # PART 2 : Redirect other old URLs # To essentially remove the date prefix, eg. "YYYY-MM-DD-" RewriteCond %{QUERY_STRING} ^s=/d{4}-/d{2}-/d{2}-(.+) RewriteRule ^portfolio/post\.php$ /projecten/%1? [R=302,L] 

^s=[0-9{4}]+-(.+?)/?[0-9{2}]+-(.+?)/?[0-9{2}]+-(.+?)/?(.*)$

Ceci est un peu un mélange , mais semble trop complexe pour ce que vous essayez de réaliser? Par exemple, pourquoi avez-vous besoin de faire correspondre une barre oblique facultative (c.-à-d. /? )? Votre exemple d’URL ne contient pas de barres obliques?

Un modèle de regex tel que [0-9{4}]+ ne fait pas ce que vous pensez. Cela correspondrait à l’un des caractères 0123456789{} une ou plusieurs fois. Ce que vous semblez essayer de faire est de faire correspondre exactement 4 chiffres. par exemple. [0-9]{4} (identique à /d{4} , utilisant une classe de caractères abrégée).