如何编写ModRewrite规则,判断选择器是否存在以正确重写URL?
URL重写规则优化:区分有无选择器的场景
需求说明
- 无选择器URI:
/feeds/mydata.json→ 重写为/content/feeds/mydata/app.json - 单选择器URI:
/feeds/mydata.sale.json→ 重写为/content/feeds/mydata/app.sale.json - 多选择器URI:
/feeds/mydata.sale.big.json→ 重写为/content/feeds/mydata/app.sale.big.json
现有规则问题
你当前的第一条规则^/feeds/([^.]*).(.*).json会错误匹配无选择器的场景:([^.]*)匹配mydata,(.*)匹配空字符串,最终生成错误路径/feeds/mydata/app..json。
解决方案
方案1:调整正则表达式(推荐)
修改第一条规则的正则,确保选择器部分(第二个捕获组)至少包含一个字符,避免匹配无选择器的请求:
# 处理带选择器的场景(单个或多个选择器) RewriteRule ^/feeds/([^.]+)\.([^.]+.*)\.json$ /content/feeds/$1/app.$2.json [PT,L] # 处理无选择器的场景 RewriteRule ^/feeds/([^.]+)\.json$ /content/feeds/$1/app.json [PT,L]
[^.]+:确保基础名称(如mydata)不包含点,避免匹配混乱;[^.]+.*:保证选择器部分至少有一个字符,覆盖单选择器和多选择器的情况。
方案2:使用RewriteCond做条件判断
通过条件检查URI中是否存在额外的点(除了.json的点),再应用对应规则:
# 仅当URI包含至少两个点时(即存在选择器),应用此规则 RewriteCond %{REQUEST_URI} ^/feeds/[^.]+\.[^.]+\.json$ RewriteRule ^/feeds/([^.]*)\.(.*)\.json$ /content/feeds/$1/app.$2.json [PT,L] # 处理无选择器的场景 RewriteRule ^/feeds/(.*)\.json$ /content/feeds/$1/app.json [PT,L]
RewriteCond的正则^/feeds/[^.]+\.[^.]+\.json$确保URI中除了最后的.json外,还有至少一个其他的点,精准过滤出带选择器的请求。
内容的提问来源于stack exchange,提问作者Vishal--JAVA--CQ
相关产品推荐
相关产品推荐

