Redirect on $args based on multiple params?

Maxim Dounin mdounin at mdounin.ru
Thu Mar 26 13:35:40 MSK 2009


Hello!

On Thu, Mar 26, 2009 at 01:17:36AM +0300, Igor Sysoev wrote:

> 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 :)

Sure. :)

And it looks like you also forgot about my patch that fixes them 
when used in ssi subrequests.  It still applies cleanly to 0.7.44.  
Should I resend it?

Maxim Dounin





More information about the nginx mailing list