Nginx 通过子目录名称重写多个 GET 变量?

Nginx 通过子目录名称重写多个 GET 变量?

我目前正在使用 nginx 重写来传递服务器变量。我可以传递这样的变量:http://example.com/test这样它就可以将其传递为:http://example.com/?p=test。我这样做:

location / {
  rewrite ^/([^/\.]+)$ /?p=$1 break;
}

现在我希望能够使用子目录传递变量,以便映射像这样发生:

http://example.com/profile/user1=>http://example.com/?p=user1

并且我想要有多个这样的规则,以便在同一个网站上我也有这样的规则:

http://example.com/play/vid1=>http://example.com/?v=vid1

我尝试了这个但是没有用:

location /profile/ {
  rewrite ^/([^/\.]+)$ /?p=$1 break;
}
location /play/ {
  rewrite ^/([^/\.]+)$ /?v=$1 break;
}

我也尝试过不使用尾部斜杠,例如:

location /profile {
  rewrite ^/([^/\.]+)$ /?p=$1 break;
}
location /play {
  rewrite ^/([^/\.]+)$ /?v=$1 break;
}

我怎样才能做到这一点?

答案1

我可以像这样完成它:

if ( $uri ~ "^/play$" ) {
 rewrite (.*)  /;
}
if ( $uri ~ "^/play/([0-9A-Za-z]*)$" ) {
  rewrite ^/play/([0-9A-Za-z]*)$ /?ref=$1;
}

答案2

你不应该if在这里使用。在 nginx 中实现这些事情的正确方法是location块。例如:

location ~ /profile/(.+)$ {
    rewrite ^ /p=$1 break;
}

location ~ /play/(.+)$ {
    rewrite ^ /v=$1 break;
}

在这里,我们将路径与location指令进行匹配,将目录后的部分捕获到变量中,并将其与重定向一起使用。

相关内容