如何通过htaccess rewrite将URL多级目录转换为查询字符串传递给index.php
任意层级URL路径转查询参数重写规则实现
这里提供Nginx、Apache两种主流服务器的实现方案,同时附更稳妥的业务层处理方案:
1. 服务器层直接拼合参数方案
Nginx 配置
server { # 其他现有配置省略 location / { # 排除真实存在的静态文件、目录,避免静态资源无法访问 if (-f $request_filename) { break; } if (-d $request_filename) { break; } # 递归提取路径段拼合查询参数,适配任意层级 rewrite ^/(.*)/([^/]+)$ /$1?p$arg_pn=$2&pn=$((arg_pn + 1))? last; # 匹配最后一段路径赋值p1 rewrite ^/([^/]+)$ /?p1=$1? last; # 所有请求最终转发到index.php rewrite ^ /index.php last; } }
Apache .htaccess 配置
RewriteEngine On # 排除真实存在的静态文件、目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 递归提取路径段拼合查询参数 RewriteRule ^([^/]+)/(.*)$ $2?p%{ENV:P_COUNT}=%1&P_COUNT=%{ENV:P_COUNT}+1 [L,E=P_COUNT:%{ENV:P_COUNT}+1] # 匹配最后一段路径赋值p1 RewriteRule ^([^/]+)$ ?p1=$1 [L,QSA] # 所有请求最终转发到index.php RewriteRule ^ index.php [L]
2. 更推荐的简化实现方案
服务器层递归处理容易触发递归次数限制,且层级过高时性能损耗明显,更建议直接把完整路径传给PHP处理,无任何层级限制:
Nginx 简化配置
location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?full_path=$1 last; } }
Apache 简化配置
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?full_path=$1 [L,QSA]
PHP 处理代码
<?php $fullPath = trim($_GET['full_path'] ?? '', '/'); $pathParams = []; if ($fullPath !== '') { $segments = explode('/', $fullPath); foreach ($segments as $index => $value) { $pathParams['p' . ($index + 1)] = $value; } } // 得到的$pathParams就是p1、p2...pn的键值对,完全符合需求格式
内容的提问来源于stack exchange,提问作者MKC
相关产品推荐
相关产品推荐

