web-dev-qa-db-fra.com

Erreur 500 lors de l'utilisation d'une règle "Redirect 301" dans htaccess

J'essaie de rediriger une ancienne URL

http://example.com/keyboard/keyboardchart.php?gam=7&sty=15&lay=1

vers une nouvelle URL

http://example.com/keyboard/keyboard-chart.php?gam=7&sty=15&lay=1

en utilisant .htaccess.

Voici le contenu de example.com/keyboard/.htaccess:

IndexIgnore *
Redirect 301 keyboardchart.php keyboard-chart.php

Cependant, je reçois une "500 Internal Server Error" lors de la navigation vers l'ancienne URL.

Qu'est-ce que je fais mal?

3
posfan12
Redirect 301 keyboardchart.php keyboard-chart.php

L'erreur 500 est due au fait que l'URL cible est relative. Ce n'est pas autorisé avec un mod_alias Redirect. L'URL cible doit être soit absolue (avec un schéma et un nom d'hôte), soit doit commencer par une barre oblique (relative à la racine).

Mais aussi, le chemin de l'URL source ne correspondra pas non plus. Vous devez spécifier un chemin URL relatif à la racine, en commençant par une barre oblique.

Indépendamment de l'emplacement du fichier .htaccess, la directive mod_alias Redirect est identique. Contrairement à mod_rewrite (RewriteRule) qui a le concept de "préfixe de répertoire".

Ainsi, comme le suggère Vlad Shundalov, vous auriez besoin d’une directive de la forme:

Redirect 301 /keyboard/keyboardchart.php /keyboard/keyboard-chart.php

Notez que cela correspond à any chaîne de requête. La chaîne de requête est automatiquement transmise à la cible. Vous ne pouvez pas réellement faire correspondre la chaîne de requête avec un mod_alias Redirect.

Si vous devez faire correspondre la chaîne de requête spécifique, vous devez utiliser mod_rewrite à la place. Par exemple, dans le fichier example.com/keyboard/.htaccess, vous pouvez écrire quelque chose comme:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^gam=7&sty=15&lay=1$
RewriteRule ^keyboardchart\.php$ /keyboard/keyboard-chart.php [R=301,L]

Notez que vous ne déclarez pas le sous-répertoire sur le RewriteRulemotif dans ce cas, cependant, vous avez toujours besoin d'un chemin relatif à la racine sur le substitution ( sauf si vous spécifiez le chemin avec une directive RewriteBase). La chaîne de requête est automatiquement transmise à la substitution par défaut.

2
MrWhite