如何使用RewriteRule将URL中最多3个可选子文件夹重写为查询字符串
适配需求的RewriteRule写法
RewriteRule ^(?:([^/]+)(?:/([^/]+)(?:/([^/]+))?)?)?/*$ player.php?app=$1&stream=$2&mode=$3 [L,QSA]
规则说明
- 所有非捕获组(带
?:前缀的括号)搭配末尾的?实现每一级路径的可选性,兼容从根路径到3级子文件夹的所有场景,不会出现404 - 每一级参数的捕获规则为
[^/]+,天然不会包含斜杠作为参数值,末尾的/*会直接匹配丢弃所有结尾斜杠,不会被捕获进mode参数 - 保留
QSA标志即可自动拼接原有查询字符串,无需手动追加&%{QUERY_STRING},避免空查询字符串时出现多余的&符号
原有规则问题排查
- 原有规则强制要求路径至少存在2个斜杠分隔的段,所以1级路径和根路径会直接触发404
- 最后一段捕获规则为
(.*)?,会把路径末尾的斜杠也作为内容捕获,导致mode参数携带多余的尾斜杠
测试场景匹配效果
你给出的5个测试URL均可正常匹配,参数输出完全符合要求:
https://wowza.example.com/App/Stream/Mode/?other=stuff→app=App、stream=Stream、mode=Mode、other=stuffhttps://wowza.example.com/App/Stream/Mode→app=App、stream=Stream、mode=Modehttps://wowza.example.com/App/Stream/→app=App、stream=Stream、mode=https://wowza.example.com/App→app=App、stream=、mode=https://wowza.example.com→app=、stream=、mode=
可选优化(按需使用)
如果需要跳过真实存在的文件、目录不重写,在规则前添加以下两行即可:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d
内容的提问来源于stack exchange,提问作者GDP
相关产品推荐
相关产品推荐

