URL重写是通过服务器配置规则,将用户访问的友好URL转换为实际后端可识别的请求路径的技术,在这个过程中GET参数的传递和获取需要遵循特定的规则,否则容易出现参数丢失或者获取异常的问题。

URL重写的基本工作原理
URL重写的核心是在请求到达后端应用之前,先由服务器(如Nginx、Apache)按照预设规则修改请求的URI。比如将/article/123重写为/article.php?id=123,这个过程中如果原始请求携带了GET参数,就需要考虑参数如何跟随重写规则流转。
重写规则对参数的默认处理
大部分服务器重写规则的默认行为是:如果重写后的目标地址没有显式声明参数拼接逻辑,原始请求携带的GET参数会自动附加到重写后的URI后面。比如用户访问/article/123?page=2,按照上述规则重写后,实际请求会变成/article.php?id=123&page=2。
不同服务器下的参数传递配置
Nginx环境下的配置示例
Nginx的rewrite指令如果不添加last或者break等标记,默认会保留原始参数,若需要自定义参数拼接逻辑,可以使用$args变量获取原始参数:
# 将 /product/123 重写为 /product.php?id=123,同时保留原始GET参数
location /product/ {
rewrite ^/product/(d+)$ /product.php?id=$1&$args last;
}
上述配置中$args就是原始请求携带的所有GET参数字符串,拼接后就能保证参数不丢失。
Apache环境下的配置示例
Apache的mod_rewrite模块中,默认情况下RewriteRule不会自动保留查询字符串,需要添加QSA(Query String Append)标记来拼接原始参数:
# 开启重写引擎 RewriteEngine On # 将 /blog/456 重写为 /blog.php?post_id=456,同时保留原始GET参数 RewriteRule ^blog/(d+)$ /blog.php?post_id=$1 [QSA,L]
如果没有添加QSA标记,原始请求中的GET参数会被丢弃,只有规则中显式定义的post_id参数会被传递。
后端获取GET参数的方法
重写完成后,后端应用获取GET参数的方式和普通请求没有区别,因为服务器已经将重写后的完整URI传递给了后端,参数会包含在请求的查询字符串中。
PHP获取示例
PHP中可以通过$_GET超全局数组直接获取所有GET参数:
<?php
// 假设重写后请求为 /article.php?id=123&page=2
// 获取文章ID
$articleId = $_GET['id'] ?? 0;
// 获取页码参数
$page = $_GET['page'] ?? 1;
echo "文章ID:{$articleId},当前页码:{$page}";
?>
Node.js(Express框架)获取示例
Express框架中可以通过req.query对象获取GET参数:
const express = require('express');
const app = express();
app.get('/article/:id', (req, res) => {
// 注意这里如果用了URL重写,实际路由是 /article.php,不过Express也可以通过重写中间件实现类似逻辑
// 获取路径参数和查询参数
const articleId = req.params.id;
const page = req.query.page || 1;
res.send(`文章ID:${articleId},当前页码:${page}`);
});
app.listen(3000, () => {
console.log('服务运行在3000端口');
});
Java(Spring Boot)获取示例
Spring Boot中可以通过@RequestParam注解获取GET参数:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ArticleController {
@GetMapping("/article")
public String getArticle(
@RequestParam(value = "id", defaultValue = "0") Integer id,
@RequestParam(value = "page", defaultValue = "1") Integer page
) {
return "文章ID:" + id + ",当前页码:" + page;
}
}
常见问题与注意事项
- 重写规则没有添加参数拼接标记(如Nginx的
$args、Apache的QSA)会导致原始GET参数丢失。 - 重写后的目标地址如果已经包含了查询字符串,再拼接原始参数时要注意格式,避免出现两个
?的情况,服务器一般会正常处理,但建议规范拼接逻辑。 - 如果需要对GET参数做校验或者过滤,建议在获取参数后再进行处理,不要依赖重写规则做参数过滤,避免规则过于复杂难以维护。
- 测试时可以通过查看服务器访问日志或者后端打印请求参数的方式,确认参数是否正确传递。
URL重写的核心是URI转换,GET参数的传递本质是在转换过程中保留原始查询字符串,只要配置时显式处理参数拼接逻辑,后端就能正常获取所有参数。
URL_rewriteGET参数参数传递参数获取修改时间:2026-06-10 00:00:26