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