Redirect on $args based on multiple params?

Maxim Dounin mdounin at mdounin.ru
Wed Mar 25 20:58:00 MSK 2009


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;
    }

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





More information about the nginx mailing list