htaccess重写规则:无查询串跳转/reset带查询串放行配置
htaccess重写规则调整方案
需求说明
当前已配置的htaccess规则会在访问路径不符合预设放行条件时,重定向至/login路径,目前无查询字符串的URL处理逻辑正常。现需要调整规则:
- 携带查询字符串的
/reset路径(例:/reset?6tdsBMxpeeJEDUvYzwKmLzIusLYLjgMtIj)加入放行列表,不触发跳转 - 不带查询字符串的
/reset路径仍然保持原有拦截跳转逻辑
原有规则问题
原有放行逻辑仅通过REQUEST_URI判断路径,没有结合查询字符串(QUERY_STRING)状态做判定,无法区分带参和不带参的/reset路径。另外原规则中RewriteBase /index.php属于错误配置,RewriteBase仅用于设置重写的基准路径,不需要填写入口文件名。
修正后完整规则
RewriteEngine On # 修正RewriteBase为站点根路径,若站点部署在子目录请对应修改 RewriteBase / # 放行/login路径 RewriteCond %{REQUEST_URI} !^/login$ # 放行/forgotten路径 RewriteCond %{REQUEST_URI} !^/forgotten$ # /reset路径判定:要么请求不是/reset,要么是/reset但无查询字符串,满足任意一条才进入跳转逻辑 RewriteCond %{REQUEST_URI} !^/reset$ [OR] RewriteCond %{QUERY_STRING} ^$ RewriteRule ^([^\.]+)$ /login [R=301,L,QSD] RewriteRule ^(/)?$ /login [R=301,L] RewriteRule ^([^\.]+)$ $1.php [NC,L]
规则逻辑说明
新增的两条判定条件实现了/reset路径的差异化处理:
- 第一条带
[OR]标记的条件:判断请求路径不是/reset,如果条件成立,直接通过判定,进入后续跳转逻辑 - 第二条条件仅在请求路径是
/reset时触发:如果查询字符串为空,判定成立,触发跳转至/login;如果查询字符串不为空,判定不成立,整个条件组不匹配,不会触发跳转,直接走后续的PHP文件解析逻辑,实现带参/reset路径的放行。
测试注意事项
301重定向会被浏览器本地强缓存,修改规则后请先清除浏览器缓存再做测试,避免旧缓存规则干扰结果判定。
内容的提问来源于stack exchange,提问作者DataConnect
相关产品推荐
相关产品推荐

