2017-09-21 5 views
-1

C'est plus ou moins une question à propos de la redirection [301] sur Apache, mais d'autres règles requises pour le CMS Joomla.Rediriger les anciennes URLs après la relance avec Joomla sur Apache 2.4

Nous avons relancé un site Web avec Joomla 3. L'ancien était un autre CMS. Maintenant, nous aimerions rediriger [301] l'ancienne URL vers le nouvel emplacement.

Le problème semble être que cela ne fonctionne pas. Je voudrais avoir une solution qui pourrait s'adapter à tous nos cas (près de 300).

Voici quelques exemples que nous aimons à rediriger (ancien => nouveau):

/index.php?CID=1 =>/
/index.php?CID=2&Kat=1$ =>/
/index.php?CID=3&Kat=2&PID=100 => /new/path 
/old/path/file.extention => /new/file/path 
/old/page.html => /new/page 
/show_image.php?image=123456.jpg&text=Very%20Long%TEXT => /new/path/location 
/show_image.php?image=654321.jpg&text=Very%20Long%TEXT => /other/path/location 

I Tried déjà quelques RewriteRules comme:

RewriteRule ^/index\.php\?CID=1$ http://%{HTTP_HOST}/ [R=301,L] 

OU

RedirectMatch 301 ^/index\.php\?CID=1$/

Pour certaines URLs la version RedirectMatch fonctionne mais pas pour la plupart d'entre eux, en particulier pas toutes les URL indiquant avec /index.php, je suppose e parce que c'est le point d'entrée pour Joomla.

Existe-t-il un moyen de rediriger des URL concrètes, y compris une fois que le fichier commence par /index.php avant que Joomla RewriteRule ne devienne actif? RewriteEngine est activé et fonctionne avec le htaccess par défaut fourni avec Joomla: les URL SEF et la réécriture d'URL sont activées.

S'il vous plaît donnez-moi un indice dans la bonne direction. Thx

Voici la configuration de la valeur par défaut Joomla si vous ne savez pas: En attendant, je me trouve la solution

<IfModule autoindex> 
    IndexIgnore * 
</IfModule> 

Options +FollowSymlinks 
Options -Indexes 

RewriteEngine On 

RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR] 
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] 
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] 
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) 
RewriteRule .* index.php [F] 

RewriteBase/
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 
RewriteCond %{REQUEST_URI} !^/index\.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php [L] 

Répondre

0

et je veux partager avec vous.

Le problème principal ici est que si vous souhaitez rediriger des URL avec une chaîne de requête, vous ne pouvez pas utiliser Redirect ou RedirectMatch. Vous devez utiliser une règle de réécriture avec une condition de réécriture de chaîne de requête, il n'y a pas moyen de contourner cela. Et cela signifie que vous allez vous retrouver avec au moins deux lignes pour certaines des URL (pas ce que j'espérais), pour une URL sans aucune chaîne de requête, cela fonctionnera dans une ligne.

Voici donc les quelques solutions pour les exemples donnés:

/index.php?CID=1 =>/
/index.php?CID=2&Kat=1$ =>/

Parce que la chaîne de requête est différent, mais le fichier/chemin (index.php) et la destination (/) est le même que nous pouvons concaténer la condition Rewrite avec un OU Drapeau:

RewriteCond %{QUERY_STRING} ^CID=29$ [OR] 
RewriteCond %{QUERY_STRING} ^CID=2&Kat=1$ 
RewriteRule ^index\.php$ /? [R=301,L] 

impuissant ici est le ? dans la dernière ligne. Si vous ne mettez qu'un / à la destination, apache sera redirigé vers, par exemple. /?CID = 29 pas seulement /

Pour tout autre exemple avec une chaîne de requête que vous devez faire très similaire

/index.php?CID=3&Kat=2&PID=100 => /new/path 
/show_image.php?image=123456.jpg&text=Very%20Long%TEXT => /new/path/location 
/show_image.php?image=654321.jpg&text=Very%20Long%TEXT => /other/path/location 

Ce sont résoud comme suit:

RewriteCond %{QUERY_STRING} ^CID=3&Kat=2&PID=100$ 
RewriteRule ^index\.php$ /new/path? [R=301,L] 

RewriteCond %{QUERY_STRING} ^image=123456\.jpg&text=Very%20Long%TEXT$ 
RewriteRule ^show_image\.php$ /new/path/location? [R=301,L] 

RewriteCond %{QUERY_STRING} ^image=654321\.jpg&text=Very%20Long%TEXT$ 
RewriteRule ^show_image\.php$ /other/path/location? [R=301,L] 

S'il vous plaît noter le vous devez ajouter le ? à la fin aussi.

Pour tous les exemples sans chaîne de requête, cela fonctionne comme d'habitude. Voici quelques-uns des exemples que je mentionnais:

/old/path/file.extention => /new/file/path 
/old/page.html => /new/page 

Nous venons de redirigeons comme ceci:

RewriteRule ^old/path/file\.extention$ /new/file/path [R=301,L] 
RewriteRule ^old/page\.html$ /new/page [R=301,L] 

Quelques remarques supplémentaires:

Parce que le modèle de règle de réécriture (le fichier d'origine/path) ou le pattern Rewrite Condition (dans ce cas la chaîne de requête) est toujours interprété comme une expression régulière où doth signifie "any character" Je place toujours un \ devant, donc je ne fais que correspondre au fichier ou à la requête chaîne et pas une certaine sim fichiers ilar comme "index-php" ou "index7php" etc. Si vous avez d'autres caractères spécifiques à RegEx (par ex. + ou *) vous devriez faire la même chose.

J'ai également eu un motif de règle de réécriture où l'URL d'origine incluait de l'espace, cela provoquerait une erreur 500 mais pourrait être résolu très simplement en plaçant le trou Rewrite Rule Pattern entre guillemets.

Cela fonctionnera sous Apache 2.4. et j'espère que ça pourrait aider!

Pour vous tous comment veut placer cela dans le fichier .htaccess à venir avec Joomla, vous devriez le mettre avant RewriteBase / C'est là que les réoriente personnalisés devraient être