Quel urlrewriting avec $args ?

WRInaute accro
Bonjour

Je cherche à faire l'urlrewriting d'une page appelée avec des paramètres précis, mais produits par une form html, donc il est quasiment impossible de savoir l'ordre des paramètres.

Le paramètre PARAM[] se présente donc comme ceci : PARAM%5B%5D , et je fait un map.

Il peut y avoir plusieurs PARAM[] dans la $querystring.

Le troisième map c'est pour fixer l'ordre des paramètres, et traduire $args en un string et les paramètres séparés par #.

Actuellement, rien ne passe, l'urlrewriting ne se fait pas.

Pouvez-vous m'aider à mettre au point cet urlrewriting ?

Merci beaucoup.



Code:
    map (%5B|%5D) $brackets {
        %5B [;
        %5D ];
    }

    map $args $argsfromparams {
        PARAM$brackets$brackets=\d+ PAR[]=$arg_PARAM;
        default $args;
    }
       
    map $args $argsfromargs {
        ^(?:(ENTIERS=[\dt.-]+|MODE=\d|REDIRECT=\d|TEND=\d|PARAM$brackets$brackets=\d+|TAB_P=[\d.]*|AFFIC=\d|FIRST_PERIODE=\d+|LAST_PERIODE=\d+)&?)+$ ENT=$arg_ENTIERS#MO=$arg_MODE#RED=$arg_REDIRECT#TEN=$arg_TEND#TAB=$arg_TAB_P#AFF=$arg_AFFIC#FIRST=$arg_FIRST_PERIODE#LAST$arg_LAST_PERIODE#$argsfromparams;
        default $args;
    }
 
Dernière édition:
Nouveau WRInaute
Bonjour,

map (%5B|%5D) $brackets {
%5B "[";
%5D "]";
}

# Extraction des paramètres PARAM[]
map $args $argsfromparams {
~*PARAM\[\]=(\d+)(&|$) "PAR[]=$1";
~PARAM\[\]=(\d+)&(.)$ "PAR[]=$1#$argsfromparams";
default "";
}

# Réorganisation des paramètres dans l'ordre souhaité
map $args $argsfromargs {
~^(?:(ENTIERS=([^&]+)|MODE=(\d+)|REDIRECT=(\d+)|TEND=(\d+)|TAB_P=([^&]+)|AFFIC=(\d+)|FIRST_PERIODE=(\d+)|LAST_PERIODE=(\d+))&?)$ "ENT=$arg_ENTIERS#MO=$arg_MODE#RED=$arg_REDIRECT#TEN=$arg_TEND#TAB=$arg_TAB_P#AFF=$arg_AFFIC#FIRST=$arg_FIRST_PERIODE#LAST=$arg_LAST_PERIODE#$argsfromparams";
default $args;
}

# Règle de rewriting
location /votre-page-origine {
rewrite ^/votre-page-origine$ /nouvelle-page?$argsfromargs permanent;
}


Plusieurs erreurs :


  1. Problème de syntaxe dans la map $brackets : Les crochets étaient notés avec un point-virgule plutôt qu'avec des guillemets. J'ai remplacé [; par "[" et ]; par "]".
  2. Traitement des paramètres multiples PARAM[] : Votre configuration ne capturait pas correctement les multiples occurrences de PARAM[]. J'ai ajouté une expression régulière récursive pour traiter ce cas.
  3. Expression régulière trop restrictive : Votre regex dans la dernière map était trop rigide et n'acceptait que des valeurs numériques pour certains paramètres. J'ai assoupli les contraintes pour accepter plus de formats.
  4. Absence de règle de rewriting finale : J'ai ajouté une directive location avec la règle rewrite qui utilise le résultat des maps.
  5. Correction de la concaténation : Dans la dernière map, il manquait un signe égal pour le paramètre LAST : #LAST$arg_LAST_PERIODE devrait être #LAST=$arg_LAST_PERIODE.
 
WRInaute accro
Bonjour site-voyance

La récursion ne semble pas se faire.

Le paramètre PARAM[]=1 est le seul PARAM[] urlrewrité.

Je ne sais pas comment faire un map récursif.

Merci beaucoup de ton aide.

Sinon, j'ai remplacé les dièzes par des deux points ( : ).

Voici les logs sous localhost.



Code:
=> avant rewriting : 127.0.0.1 - - [01/Apr/2025:19:01:51 +0200] "GET /courses-lendemain/pronostics-courses.html?ENTIERS=1-2t3t1t2.2056t0.0304&MODE=1&REDIRECT=1&TEND=3&PARAM[]=1&PARAM[]=2&PARAM[]=3&TAB_P=1.2.3.4.5.6.7.8.9.10.11&AFFIC=1&FIRST_PERIODE=8098&LAST_PERIODE=8099 HTTP/1.1" 301 169 "-" "curl/8.9.1"

=> après rewriting : 127.0.0.1 - - [01/Apr/2025:19:01:51 +0200] "GET /pwa.php?type=LEND_STATENT=1-2t3t1t2.2056t0.0304:MO=1:RED=1:TEN=3:TAB=1.2.3.4.5.6.7.8.9.10.11:AFF=1:FIRST=8098:LAST=8099:PAR[]=1 HTTP/1.1" 200 8796 "-" "curl/8.9.1"


map :
*****

map (%5B|%5D) $brackets {
%5B "[";
%5D "]";
}

# Extraction des paramètres PARAM[]
map $args $argsfromparams {
        ~*PARAM\[\]=(\d+)(&|$) "PAR[]=$1";
        ~PARAM\[\]=(\d+)&(.)$ "PAR[]=$1:$argsfromparams";
        default "";
}

# Réorganisation des paramètres dans l'ordre souhaité
map $args $argsfromargs {
~(?:(ENTIERS=([^&]+)|MODE=(\d)|REDIRECT=(\d)|TEND=(\d)|TAB_P=([^&]+)|AFFIC=(\d)|FIRST_PERIODE=(\d+)|LAST_PERIODE=(\d+))&?)$ "ENT=$arg_ENTIERS:MO=$arg_MODE:RED=$arg_REDIRECT:TEN=$arg_TEND:TAB=$arg_TAB_P:AFF=$arg_AFFIC:FIRST=$arg_FIRST_PERIODE:LAST=$arg_LAST_PERIODE:$argsfromparams";
default $args;
}


Règle de rewriting
******************
location  = /courses-lendemain/pronostics-courses.html {

        root /;

        rewrite ^/courses-lendemain/pronostics-courses\.html$ /pwa.php?type=LEND_STAT$argsfromargs? permanent;
}
 
WRInaute accro
Bonjour site-voyance

Il n'ya pas que des PARAM[] dans $args.

En ce qui concerne le map récursif :

Le token accédé récursivement

~PARAM\[\]=(\d+)&(.)$

est-il réellement trouvé ?

Le (.) correspond à un seul n'importe quel caractère avant la fin de ligne.

Ces tokens accédés semblent aller de l'avant vers l'arrière.

Ne serait-il pas mieux de les arranger de l'arrière vers l'avant ?

Et les tokens traduits

"PAR[]=$1:$argsfromparams"

vont de l'avant vers l'arrière.

La variable $argsfromparams

est-elle évaluée et affectée récursivement dans le map ?

Donc : un map peut-il être récursif ?

Merci beaucoup.
 
Nouveau WRInaute
map (%5B|%5D) $brackets {
%5B "[";
%5D "]";
}

# Extraction des paramètres PARAM[]
map $args $argsfromparams {
# Première occurrence
~^(.?)PARAM\[\]=([^&]+)(.*)$ "$1PAR[]=$2$argsfromparams_next";
# Si aucun paramètre PARAM[] n'est trouvé
default "";
}

# Récursion pour les paramètres suivants
map $3 $argsfromparams_next {
# S'il y a encore un PARAM[], ajouter un séparateur suivi du paramètre
~^(.?)PARAM\[\]=([^&]+)(.*)$ ":PAR[]=$2$argsfromparams_next";
# Si plus de PARAM[], terminer
default "";
}

# Réorganisation des paramètres dans l'ordre souhaité
map $args $argsfromargs {
~(?:(ENTIERS=([^&]+)|MODE=(\d)|REDIRECT=(\d)|TEND=(\d)|TAB_P=([^&]+)|AFFIC=(\d)|FIRST_PERIODE=(\d+)|LAST_PERIODE=(\d+))&?)$ "ENT=$arg_ENTIERS:MO=$arg_MODE:RED=$arg_REDIRECT:TEN=$arg_TEND:TAB=$arg_TAB_P:AFF=$arg_AFFIC:FIRST=$arg_FIRST_PERIODE:LAST=$arg_LAST_PERIODE:$argsfromparams";
default $args;
}

location = /courses-lendemain/pronostics-courses.html {
root /;
rewrite ^/courses-lendemain/pronostics-courses\.html$ /pwa.php?type=LEND_STAT$argsfromargs? permanent;
}
 
Nouveau WRInaute
Le problème vient de votre map $argsfromparams. La récursion n'est pas configurée correctement.
Pour tester cette configuration, redémarrez Nginx après avoir appliqué ces changements, et vérifiez les logs pour vous assurer que tous les paramètres PARAM[] sont correctement transmis.

Réessayer
O
 
WRInaute accro
Bonjour site voyance

Cà ne marche pas du tout.

L'urlewriting se fait, les noms des paramètres sont inchangés et les séparateurs sont l'éperluette ( & ).

L'url ne change pas après ou avant l'urlrewriting.

PARAM n'est pas nécessairement au début du request, le ^ du premier map ne faut-il pas l'enlever ?

Le $3 du deuxième map n'est théoriquement pas alimenté.

Efectivement si on pouvait avoir PARAM=\d+ en début de request, et compte tenu du fait que les PARAM se suivent, comment utiliser ~^ de manière récursive ?

Merci beaucoup de ton aide.


Code:
map
***

map (%5B|%5D) $brackets {
%5B "[";
%5D "]";
}

# Extraction des paramètres PARAM[]
map $args $argsfromparams {
# Première occurrence
~^(.?)PARAM\[\]=([^&]+)(.*)$ "$1PAR[]=$2$argsfromparams_next";
# Si aucun paramètre PARAM[] n'est trouvé
default "";
}

# Récursion pour les paramètres suivants
map $3 $argsfromparams_next {
# S'il y a encore un PARAM[], ajouter un séparateur suivi du paramètre
~^(.?)PARAM\[\]=([^&]+)(.*)$ ":PAR[]=$2$argsfromparams_next";
# Si plus de PARAM[], terminer
default "";
}

# Réorganisation des paramètres dans l'ordre souhaité
map $args $argsfromargs {
~(?:(ENTIERS=([^&]+)|MODE=(\d)|REDIRECT=(\d)|TEND=(\d)|TAB_P=([^&]+)|AFFIC=(\d)|FIRST_PERIODE=(\d+)|LAST_PERIODE=(\d+))&?)$ "ENT=$arg_ENTIERS:MO=$arg_MODE:RED=$arg_REDIRECT:TEN=$arg_TEND:TAB=$arg_TAB_P:AFF=$arg_AFFIC:FIRST=$arg_FIRST_PERIODE:LAST=$arg_LAST_PERIODE:$argsfromparams";
default $args;
}

urlrewiting
***********
location  = /courses-lendemain/pronostics-courses.html {
        root /;
        rewrite ^/courses-lendemain/pronostics-courses\.html$ /pwa.php?type=LEND_STAT$argsfromargs? permanent;
}


relancement Nginx 
*****************
systemctl restart  nginx.service



requete HTTP
************

curl -L "http://localhost/courses-lendemain/pronostics-courses.html?ENTIERS=1-2t3t1t2.2056t0.0304&MODE=1&REDIRECT=1&TEND=3&PARAM[]=1&PARAM[]=2&PARAM[]=3&TAB_P=1.2.3.4.5.6.7.8.9.10.11&AFFIC=1&FIRST_PERIODE=8098&LAST_PERIODE=8099"


avant urlrewriting
******************

127.0.0.1 - - [02/Apr/2025:17:01:45 +0200] "GET /courses-lendemain/pronostics-courses.html?ENTIERS=1-2t3t1t2.2056t0.0304&MODE=1&REDIRECT=1&TEND=3&PARAM[]=1&PARAM[]=2&PARAM[]=3&TAB_P=1.2.3.4.5.6.7.8.9.10.11&AFFIC=1&FIRST_PERIODE=8098&LAST_PERIODE=8099qls HTTP/1.1" 301 169 "-" "curl/8.9.1"







après urlrewriting
******************

127.0.0.1 - - [02/Apr/2025:17:01:45 +0200] "GET /pwa.php?type=LEND_STATENTIERS=1-2t3t1t2.2056t0.0304&MODE=1&REDIRECT=1&TEND=3&PARAM[]=1&PARAM[]=2&PARAM[]=3&TAB_P=1.2.3.4.5.6.7.8.9.10.11&AFFIC=1&FIRST_PERIODE=8098&LAST_PERIODE=8099qls HTTP/1.1" 200 8789 "-" "curl/8.9.1"
 
Nouveau WRInaute
# Définir les variables pour chaque paramètre individuellement
map $arg_ENTIERS $ent {
"~.+" "ENT=$arg_ENTIERS";
default "";
}

map $arg_MODE $mo {
"~.+" "MO=$arg_MODE";
default "";
}

map $arg_REDIRECT $red {
"~.+" "RED=$arg_REDIRECT";
default "";
}

map $arg_TEND $ten {
"~.+" "TEN=$arg_TEND";
default "";
}

map $arg_TAB_P $tab {
"~.+" "TAB=$arg_TAB_P";
default "";
}

map $arg_AFFIC $aff {
"~.+" "AFF=$arg_AFFIC";
default "";
}

map $arg_FIRST_PERIODE $first {
"~.+" "FIRST=$arg_FIRST_PERIODE";
default "";
}

map $arg_LAST_PERIODE $last {
"~.+" "LAST=$arg_LAST_PERIODE";
default "";
}

# Construire la chaîne finale avec les séparateurs ":" seulement quand nécessaire
map $request_uri $param_string {
"~.*" "$ent${ent:+:}$mo${mo:+:}$red${red:+:}$ten${ten:+:}$tab${tab:+:}$aff${aff:+:}$first${first:+:}$last";
}

# Traiter les PARAM[] séparément car Nginx les met tous dans $arg_PARAM[]
map $arg_PARAM[] $param_array {
"~^(.+)$" "PAR[]=$arg_PARAM[]";
default "";
}

location = /courses-lendemain/pronostics-courses.html {
root /;

# Utiliser la variable $args pour extraire tous les PARAM[]
if ($args ~ "PARAM\[\]=([^&]+)") {
set $param1 "PAR[]=$1";
}
if ($args ~ "PARAM\[\]=([^&]+).*PARAM\[\]=([^&]+)") {
set $param2 ":PAR[]=$2";
}
if ($args ~ "PARAM\[\]=([^&]+).*PARAM\[\]=([^&]+).*PARAM\[\]=([^&]+)") {
set $param3 ":PAR[]=$3";
}

# Construire l'URL finale
set $final_params "${param_string}${param_string:+:}${param1}${param2}${param3}";

rewrite ^/courses-lendemain/pronostics-courses\.html$ /pwa.php?type=LEND_STAT$final_params permanent;
}

pour tester cette configuration :

# Redémarrez Nginx
systemctl restart nginx.service

# Testez avec curl et ajoutez -v pour voir les détails
curl -v -L "http://localhost/courses-lendemain/...&AFFIC=1&FIRST_PERIODE=8098&LAST_PERIODE=8099"
 
WRInaute accro
Bonjour site voyance

J'ai réussi à isoler les PARAM de $args.

$beginofparams ne contient plus que : PARAM[]=nbre1&PARAM[]=nbre2&PARAM[]=nbre3 etc...

Je sais maintenant que les map supportent la récursivité, après avoir tracé quelques tests.

Je verrai celà demain.


Code:
# Extraction des paramètres PARAM[]
map $args $endofparams {
# Tous les PARAM plus la fin de $args.
~(&?PARAM\[\]=(?:\d+).*)$ "$1";
# Si aucun paramètre PARAM[] n'est trouvé
default "";
}

# Extraction des tokens PARAM seuls.
map $endofparams $beginofparams {
~((?:&?PARAM\[\]=(?:\d+))+).*$ "$1";
default "";
}
 
WRInaute accro
Bonjour site voyance

Je retiens ta solution :

if ($args ~ "PARAM\[\]=([^&]+).*PARAM\[\]=([^&]+).*PARAM\[\]=([^&]+)") {

}

Dans mon cas, il y au maximum 12 PARAM.

Donc c'est faisable.

Finalement, n'y a-t-il aucune possibilité de rendre un map récursif ?

Ce serait une feature ou un bug de Nginx si c'était le cas ?

Merci beaucoup beaucoup pour ton aide. ;)
 
WRInaute accro
URL rewriting de l'an 40, c'est pas faute d'avoir dit je ne sais combien de fois sur WRI qu'une seule règle de rewrite permet de tout faire en SEO/user friendly.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut