web-dev-qa-db-fra.com

Question linguistique simple .htaccess (redirection)

Je ne connais pas la langue de .htaccess, donc la question des débutants. J'ai ce code:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^m=1$
RewriteRule (.*) /$1? [R=301,L]

Il redirige toutes les URL portant l'extension ?m=1 vers l'URL sans l'extension.

Je voudrais rediriger également ?m=0 (ou ?m=anything) vers l'URL d'origine. Comment dois-je réécrire le code ci-dessus? Serait-ce juste RewriteCond %{QUERY_STRING} ^m=*$

2
IXN

C’est autant une question d’expressions régulières (regex) que de _.htaccess_. Le deuxième argument ( CondPattern ) de la directive RewriteCond prend une expression régulière, pas une expression à caractère générique . (Plus précisément, Apache utilise la version PCRE de regex .)

Serait-ce juste _RewriteCond %{QUERY_STRING} ^m=*$_

Cela suppose que l'argument est une expression de type générique plus simple (où _*_ correspond simplement à 0 caractère ou plus) - ce n'est pas le cas. En langage regex, le _*_ correspond à 0 ou plusieurs occurrences du caractère/groupe précédent . Donc, cela correspondrait exactement à _?m_ (0 occurrences), _?m=_ (1 occurrence), _?m==_ ou _?m===_, etc. Ce n'est pas du tout votre intention. Cela ne correspond même pas à votre URL d'origine.

En supposant que le paramètre d'URL m apparaisse toujours au début de la chaîne de requête, puis, pour faire correspondre _?m=<anything>_, vous pouvez simplement utiliser l'expression régulière _^m=_. Cela correspond à toute chaîne de requête commençant par _m=_ suivie de et de n'importe quoi (y compris rien ). Par exemple:

_RewriteCond %{QUERY_STRING} ^m=
_

Cependant, vous voulez généralement que regex soit aussi restrictif que possible (bien que cela puisse ne pas s'appliquer dans ce cas). Par exemple, pour faire correspondre une URL contenant la chaîne de requête _?m=N_ uniquement, où N correspond à un chiffre compris entre 0 et 9 et en l'absence d'autres paramètres d'URL, vous pouvez procéder de la manière suivante:

_RewriteCond %{QUERY_STRING} ^m=\d$
_

Où _\d_ est une classe de caractères abrégée pour tout chiffre (identique à _[0-9]_).

De plus: Testez avec 302 redirections (temporaires) pour éviter les problèmes de mise en cache et effacez le cache de votre navigateur avant de procéder aux tests.

5
MrWhite