如何编写Nginx Rewrite规则将文件名转换为查询参数
Nginx Rewrite规则:拆分查询参数中的房间号
你的规则无效是因为Nginx的rewrite指令默认只匹配URI路径部分,不包含?后面的查询字符串,而且正则里的?是特殊字符(匹配前面字符0或1次),所以根本没命中目标查询参数。
给你两种可行的解决方案:
方案一:直接用if匹配查询参数变量
if ($arg_name ~* ^room(\d{4})\.php$) { rewrite ^/download$ /download?name=room.php&room=$1? last; }
$arg_name是Nginx内置变量,直接获取name参数的值- 正则
^room(\d{4})\.php$精准匹配roomxxxx.php格式的参数,把4位房间号捕获到$1 - 末尾的
?必须加,它会丢弃原查询字符串,只保留我们构造的新参数 last表示执行完这条规则后,停止当前块的处理,重新匹配新的URI
方案二:先提取变量再构造新参数(更易扩展)
如果后续要处理更多参数,这种写法逻辑更清晰:
set $room_id ""; if ($arg_name ~* ^room(\d{4})\.php$) { set $room_id $1; } if ($room_id != "") { rewrite ^/download$ /download?name=room.php&room=$room_id? last; }
注意事项
- 把规则放在
server块或者专门的location /download块中 - 如果房间号长度不固定,把
\d{4}改成\d+即可匹配任意位数的数字 - 注意
last和break的区别:这里用last更稳妥,因为需要重新匹配新的URI路径
内容的提问来源于stack exchange,提问作者Matando
相关产品推荐
相关产品推荐

