Nginx如何去除URI中的/shop前缀适配main.php路由传参
推荐配置方案(符合Nginx最佳实践,性能更优)
# 匹配/shop开头的所有请求 location ^~ /shop/ { # 先判断请求的文件/目录是否真实存在,存在直接返回,不存在则进入重写规则 try_files $uri $uri/ @shop_rewrite; } # 自定义重写命名location location @shop_rewrite { # 正则匹配捕获/shop之后的所有路径,赋值给route参数 rewrite ^/shop(.*)$ /shop/main.php?route=$1 last; }
如果需要和原Apache规则完全对齐,排除指定后缀的静态文件走重写,可以调整为以下配置:
location ^~ /shop/ { set $skip_rewrite 0; # 请求的文件真实存在则跳过重写 if (-e $request_filename) { set $skip_rewrite 1; } # 匹配指定静态后缀则跳过重写 if ($request_uri ~* \.(ico|jpg|png|img)$) { set $skip_rewrite 1; } # 不需要跳过重写的请求执行路径提取 if ($skip_rewrite = 0) { rewrite ^/shop(.*)$ /shop/main.php?route=$1 last; } }
配置说明
- 核心逻辑是通过
rewrite的正则分组^/shop(.*)$,将/shop之后的路径内容捕获到$1变量,直接传给route参数,即可自动去除前缀。 - 如果需要保留原请求携带的其他GET参数,可将rewrite规则修改为:
rewrite ^/shop(.*)$ /shop/main.php?route=$1&$query_string last; - 配置修改完成后执行
nginx -t校验配置语法无误后,执行nginx -s reload重载配置即可生效。
内容的提问来源于stack exchange,提问作者pdqcontacts
相关产品推荐
相关产品推荐

