我目前正在使用 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
指令进行匹配,将目录后的部分捕获到变量中,并将其与重定向一起使用。