如何在Nginx中将index.php?arg=test重写为/index/test/
Nginx URL重写配置方案
要实现把index.php?arg=test重定向为地址栏显示/index/test/,以及多参数index.php?arg=test&arg2=test2&arg3=test3重写为/index/test/test2/test3/,需要分外部地址重定向和内部请求转发两部分配置,以下是完整的修改后的配置:
server { # 你的server基础配置(如listen、server_name等) # 1. 外部重定向:将旧的带参数URL跳转到美观的路径式URL # 单个参数:index.php?arg=xxx → /index/xxx/ if ($request_uri ~* ^/index\.php\?arg=([^&]+)$) { return 301 /index/$1/; } # 三个参数:index.php?arg=xxx&arg2=yyy&arg3=zzz → /index/xxx/yyy/zzz/ if ($request_uri ~* ^/index\.php\?arg=([^&]+)&arg2=([^&]+)&arg3=([^&]+)$) { return 301 /index/$1/$2/$3/; } # 2. 补全末尾斜杠:避免用户访问不带斜杠的路径出现异常 rewrite ^/index/([^/]+)$ /index/$1/ permanent; rewrite ^/index/([^/]+)/([^/]+)/([^/]+)$ /index/$1/$2/$3/ permanent; # 3. 内部转发:将美观的路径式URL转发到index.php处理 # 匹配单个参数的路径:/index/xxx/ location ~ ^/index/([^/]+)/$ { try_files $uri $uri/ /index.php?arg=$1; } # 匹配三个参数的路径:/index/xxx/yyy/zzz/ location ~ ^/index/([^/]+)/([^/]+)/([^/]+)/$ { try_files $uri $uri/ /index.php?arg=$1&arg2=$2&arg3=$3; } # 你原有的根路径处理配置 location / { try_files $uri $uri/ /index.php$is_args$args; } # 你原有的PHP处理配置 location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi.conf; fastcgi_pass unix:/run/php/php-fpm.sock; fastcgi_index index.php; } }
关键说明
- 外部重定向:通过
if结合正则匹配旧URL格式,用return 301做永久重定向(利于SEO),正则捕获组$1、$2负责提取参数值,拼接成新路径。 - 补全斜杠:确保用户访问
/index/test时自动跳转到/index/test/,避免路径不一致导致的重复内容或404问题。 - 内部转发:用正则匹配新的路径式URL,将路径片段重新转为
index.php的查询参数,后端PHP程序依然可以通过$_GET['arg']、$_GET['arg2']获取参数值,无需修改业务代码。
注意事项
- 修改配置后,先执行
sudo nginx -t检查语法是否正确,无误后执行sudo nginx -s reload使配置生效。 - 测试时请清除浏览器缓存(301重定向会被浏览器永久缓存),或使用隐私窗口测试。
- 如果需要支持更多参数,可扩展对应的正则规则和转发配置,比如四个参数就新增对应的
location块和重定向规则。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

