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?
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 RewriteRule
motif 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.