web-dev-qa-db-fra.com

les redirections combinées 301 ne fonctionnent pas

J'ai apporté des modifications aux fichiers d'un site Web et maintenant, la console de recherche m'affiche 404 erreurs pour certaines URL.

La configuration normale, qui fonctionne bien, est la suivante:

  • l'URL conviviale

    mywebsite.com/modeles-voiture/Volvo/XC60
    

est réécrit pour arriver au script PHP comme:

 RewriteCond %{REQUEST_URI} ^/?modeles-voiture [NC]
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule \/([A-Z][\-A-Za-z]+)\/([\-A-Za-z0-9\.]+$) /models.php?brand=$1&model=$2 [L]

Maintenant, j'ai d'anciennes URLs qui génèrent les erreurs 404 et qui ressemblent à ceci:

mywebsite.com/modeles.php?brand=Volvo&model=XC60

Donc, je suis venu avec la redirection suivante pour les envoyer au bon endroit.

Cette première étape redirigerait les anciennes URL vers les nouvelles adresses conviviales:

RewriteCond %{REQUEST_URI} \/modeles\.php [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule brand=([A-Z][\-A-Za-z]+)&model=([\-A-Za-z0-9\.]+$) http://www.soeezauto.com/modeles-voiture/$1/$2 [R=301,L]

Ensuite, le code existant (ci-dessous) ferait son travail habituel d’envoi au script PHP approprié.

Donc (en répétant ce que j'ai déclaré en haut):

 RewriteCond %{REQUEST_URI} ^/?modeles-voiture [NC]
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule \/([A-Z][\-A-Za-z]+)\/([\-A-Za-z0-9\.]+$) /models.php?brand=$1&model=$2 [L]

Mon cela ne fonctionne pas. Toujours obtenir une erreur 404.

J'ai testé toutes les expressions rationnelles individuelles (sur regex101.com) et elles semblent faire ce qu'elles sont censées faire.

J'ai peut-être simplement fait la fausse hypothèse concernant l'enchaînement, mais dans ce cas, quelle est la solution à ce problème?

2
BernardA
RewriteCond %{REQUEST_URI} \/modeles\.php [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule brand=([A-Z][\-A-Za-z]+)&model=([\-A-Za-z0-9\.]+$) http://www.soeezauto.com/modeles-voiture/$1/$2 [R=301,L]

Vous ne pouvez pas faire correspondre la chaîne de requête au motif RewriteRule. La RewriteRule ne correspond qu'au chemin URL (moins la chaîne de requête). Pour correspondre à la chaîne de requête, vous devez utiliser une directive RewriteCond et vérifier la variable de serveur QUERY_STRING.

Il est également plus efficace de faire correspondre le chemin d'URL dans la variable RewriteRule, plutôt que d'utiliser une condition de correspondance avec REQUEST_URI (si possible).

Essayez quelque chose comme:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^brand=([A-Z][-A-Za-z]+)&model=([-A-Za-z0-9.]+)$
RewriteRule ^modeles\.php http://www.example.com/modeles-voiture/%1/%2? [R=301,L]

Ceci correspond à la chaîne de requête exacte , par exemple. brand=Volvo&model=XC60 - s'il existe d'autres paramètres d'URL, cela ne correspond pas.

EDIT: Le ? à la fin de la substitution supprime efficacement la chaîne de requête de l'URL redirigée. Alternativement, sur Apache 2.4, vous pouvez utiliser l'indicateur QSD (Query String Discard).

Vous n'avez pas besoin d'échapper aux barres obliques dans Apache config regex. (Apex regex n'utilise pas de délimiteurs de barre oblique.) Dans une classe de caractères regex, vous n'avez pas non plus besoin d'échapper aux points littéraux, ni aux traits d'union, s'ils apparaissent au début ou à la fin de la classe de caractères.

La substitution RewriteRule utilise %1 et %2 (par opposition à $1, etc.) comme référence en retour du ou des derniers groupes capturés dans la directive RewriteCond .

2
MrWhite