Nginx 重写将查询字符串转换为路径

Yar*_*nST 13 rewrite nginx querystring

我喜欢这个简单的重写规则:

/somefolder/mypage.aspx?myid=4343&tab=overview
Run Code Online (Sandbox Code Playgroud)

重定向到:

/folder/4343/overview/
Run Code Online (Sandbox Code Playgroud)

我寻找了一些解决方案,但没有一个真正奏效。

我试过:

rewrite ^/somefolder/mypage.aspx?myid=(.*)&tab=overview$  /folder/$1/overview  permanent;
Run Code Online (Sandbox Code Playgroud)

rewrite ^/somefolder/mypage\.aspx\?myid=(.*)&tab=overview$  /folder/$1/overview  permanent;
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我收到 404

(更简单的规则工作得很好..)

谢谢

cns*_*nst 35

Valery Viktorovsky 答案的更短、更正确的版本。

location = /somefolder/mypage.aspx {
    if ($arg_tab != overview) { return 404; }
    if ($arg_myid !~ "^\d+$") { return 404; }
    rewrite ^ /folder/$arg_myid/overview? permanent;
}
Run Code Online (Sandbox Code Playgroud)

或者,嘿,如果您不需要验证参数,它甚至可以更短:

rewrite ^/somefolder/mypage.aspx /folder/$arg_myid/$arg_tab? permanent;
Run Code Online (Sandbox Code Playgroud)

  • http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work « *确保除了为您工作外,答案是非常好的做法。有时在答案被接受后,另一个会进来,发现前一个实际上是一个糟糕的黑客的事实。* » 说真的,瓦莱里的答案不仅有一个问题,而且有几个不同的问题!除了花括号,每一行本质上都是错误的! (9认同)

Val*_*sky 12

如果你想重定向

location ~ /somefolder/mypage.aspx {
    if ($args ~* "^myid=(\d+)&tab=overview") {
        set $mid $1;
        set $args '';
        rewrite ^.*$ /folder/$mid/overview permanent;
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记配置 /folder/$1/overview 位置。