You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:36:05