使用.htaccess重写URL并追加可选参数为查询字符串(转小写)
.htaccess URL重写解决方案:带可选参数的小写化URL转换
需求回顾
需要实现双向URL重写:
- 旧URL转新URL(外部跳转):
https://www.example.org/services/state.php?state=TX&city=Austin&{0-3个可选参数}→https://www.example.org/services/tx/austin/?{所有可选参数} - 新URL转旧脚本(内部重写):新格式URL无缝映射到原state.php脚本,保留所有参数
- 强制要求:新URL全小写,城市名称末尾必须保留
/?
完整.htaccess配置代码
# 开启URL重写引擎 RewriteEngine On # 定义小写转换映射(绝大多数Apache服务器支持此内置映射) RewriteMap lc int:tolower # --------------------------- # 外部跳转:旧URL → 标准化新URL(301永久跳转) # --------------------------- # 匹配包含state、city及可选参数的查询字符串 RewriteCond %{QUERY_STRING} ^state=([A-Za-z]{2})&city=([A-Za-z]+)(?:&(.*))?$ # 跳转至小写化的新URL,自动保留可选参数 RewriteRule ^services/state\.php$ /services/${lc:%1}/${lc:%2}/?%3 [R=301,QSD,L] # --------------------------- # 内部重写:新URL → 原脚本(无对外跳转) # --------------------------- # 排除真实存在的文件,避免误重写静态资源 RewriteCond %{REQUEST_FILENAME} !-f # 匹配新URL格式,自动追加所有可选查询参数 RewriteRule ^services/([a-z]{2})/([a-z]+)/?$ /services/state.php?state=$1&city=$2 [QSA,L]
关键规则解释
小写转换映射:
RewriteMap lc int:tolower是Apache内置的字符串转小写工具,能快速将提取的state和city参数转为小写,保证URL标准化。外部跳转规则:
RewriteCond精准匹配查询字符串格式:捕获2位大小写的state、任意大小写的city,以及可选的后续参数(正则自动兼容0个参数的情况)。RewriteRule中将捕获的state和city通过${lc:%1}、${lc:%2}转小写,拼接成新URL路径,可选参数%3直接追加到查询字符串;QSD标志确保丢弃原查询字符串,避免重复参数;R=301是永久跳转,利于SEO。
内部重写规则:
RewriteCond %{REQUEST_FILENAME} !-f确保只重写非真实文件的请求,防止样式、图片等静态资源被误处理。RewriteRule匹配新URL的两种合法格式(services/xx/yy/或services/xx/yy/?xxx),提取小写的state和city传递给原脚本;QSA标志自动将URL中的可选查询参数追加到原脚本的查询字符串中,无需手动处理。
测试注意事项
- 调试阶段建议将
R=301改为R=302(临时跳转),避免浏览器缓存错误的跳转规则,确认功能正常后再改回301。 - 确保你的Apache服务器已启用
mod_rewrite模块。
内容的提问来源于stack exchange,提问作者Sarah B.
相关产品推荐
相关产品推荐

