MMK
回答者
回答于 2026-10-22
在Web服务器中配置伪静态规则,利用正则表达式将形如 category.php?catid=109&areaid=10783&streetid=4625 的动态URL重写为 /category/109/10783/4625.html 等简洁路径。
Nginx 配置步骤
在 server 块中添加 rewrite 指令:
rewrite ^/category/(\d+)/(\d+)/(\d+)\.html$ /category.php?catid=$1&areaid=$2&streetid=$3 last;
(\d+)用于匹配并捕获连续数字。$1、$2、$3分别对应三个括号捕获的参数值。last表示完成重写后停止处理后续规则并重新匹配URI。
Apache 配置步骤
在网站根目录的 .htaccess 文件或主配置文件中启用 mod_rewrite 模块,并添加:
RewriteEngine On
RewriteRule ^category/([0-9]+)/([0-9]+)/([0-9]+)\.html$ category.php?catid=$1&areaid=$2&streetid=$3 [L,QSA]
[L]表示这是最后一条生效规则。[QSA]表示若原始请求带有额外查询字符串,则自动追加到重写后的URL末尾。
判断依据与适用条件
- 参数顺序固定:上述规则要求URL中参数必须严格按照 catid、areaid、streetid 的顺序出现。
- 参数类型:示例假设参数均为纯数字。若包含字母或中文,需将正则中的
\d+替换为[^/]+或对应的字符集。 - 应用层支持:后端程序(如PHP脚本)仍需正常接收
$_GET['catid']等变量,伪静态仅在服务器层面做路由转换,不改变程序逻辑。
常见误区
- 混淆重定向与内部重写:伪静态是服务器内部重写(Internal Rewrite),用户浏览器地址栏显示的是简洁路径;若使用301/302跳转,则会引发额外的HTTP请求,增加服务器负担。
- 忽略可选参数:如果 areaid 或 streetid 可能为空,单条规则无法覆盖所有情况,需要编写多条规则分别匹配不同长度的路径组合。
- 未开启相应模块:Apache环境下若未加载
mod_rewrite模块或未设置AllowOverride All,.htaccess中的规则将无法生效。