Redirect on $args based on multiple params?

Igor Sysoev is at rambler-co.ru
Thu Mar 26 01:17:36 MSK 2009


On Wed, Mar 25, 2009 at 08:58:00PM +0300, Maxim Dounin wrote:

> Hello!
> 
> On Wed, Mar 25, 2009 at 03:55:02PM +0000, Phillip B Oldham wrote:
> 
> > Is there any way to capture multiple parameters from a querystring for a  
> > rewrite?
> >
> > For example:
> > The request is: /myscript.php?a=b&c=d&z=y
> > The target is: /script/a/b/c/d/z/y
> >
> > So, the basic rewrite would be:
> >
> > location /myscript.php {
> > if( $args ~* ^a=([^\&]+)&b=([^\&]+)&z=([^\&]+)$ ){
> > rewrite ^ /script/a/$1/b/$2/z/$3 permanent;
> 
> JFYI: This won't ever pass configuration tests - captures from 
> if() will be reset by rewrite itself.  It should use intermediate 
> set's to save captures.  Also, "if(" should be rewritten as "if (", 
> and probably trailing '?' should be added to rewrite destination
> to avoid query string appending.
> 
> Correct version would be
> 
>     location /myscript.php {
>         if ($args ~* ^a=([^\&]+)&b=([^\&]+)&z=([^\&]+)$) {
>             set $a $1;
>             set $b $2;
>             set $z $3;
>             rewrite ^ /script/a/$a/b/$b/z/$z? permanent;
>         }
>     }
> 
> > }
> > }
> >
> > However, how would I cope with situations where the args aren't in the  
> > order of a/b/z? Obviously if I have 10 args I don't want to have to do  
> > an "if" for each permutation, that could get both confusing and lengthy!
> 
> In 0.7.8+ you may use $arg_* variables for this, e.g.
> 
>     location /myscript.php {
>         rewrite ^ /script/a/$arg_a/b/$arg_b/z/$arg_z? permanent;
>     }

I forgot simply about them :)

> Note that this isn't exactly the same thing as the original one 
> since it doesn't actually test presence of the arguments.
> 
> Compatible with 0.6.* version would be
> 
>     location /myscript.php3 {
>         set $a "";
>         set $b "";
>         set $z "";
>         if ($args ~* "(?:^|&)a=([^&]+)") {
>             set $a $1;
>         }
>         if ($args ~* "(?:^|&)b=([^&]+)") {
>             set $b $1;
>         }
>         if ($args ~* "(?:^|&)z=([^&]+)") {
>             set $z $1;
>         }
>         rewrite ^ /script/a/$a/b/$b/z/$z? permanent;
>     }
> 
> Maxim Dounin


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list