如何在现有Apache2 rewrite规则基础上新增规则避免无限重定向
无限循环原因
- 新增的两条规则形成闭环:访问
/help/open时先被内部重写为open.php,触发跳转规则跳转到/help/submit;/help/submit又被重写回open.php,再次触发跳转,陷入无限循环 - 规则排序逻辑错误,自定义规则和通用重写规则的优先级混乱,也会导致匹配异常
修复后的完整配置
将以下内容替换原有/var/www/html/help/.htaccess的全部规则即可:
# /var/www/html/help/.htaccess # 自定义外部跳转:原始请求访问/open或/open.php时跳转至/help/submit,排除POST请求 RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/help/(open)(\.php)?\s [NC] RewriteRule ^ /help/submit [R=302,NE,L] # 原有规则:外部重定向.php后缀到无后缀路径,排除POST请求 RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] RewriteRule ^ %1 [R=302,NE,L] # 自定义内部重写:将/help/submit内部映射到open.php,地址栏保持不变 RewriteRule ^submit$ open.php [L,NC] # 原有规则:内部重定向无后缀路径到对应.php文件 RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [L]
配置说明
- 所有外部跳转规则均匹配用户发起的原始请求(通过
THE_REQUEST变量判断),不会匹配服务器内部重写产生的路径,从根源避免循环触发跳转规则 - 规则按照「外部跳转优先、自定义规则优先于通用规则」的顺序排列,避免通用规则提前匹配覆盖自定义逻辑
- 自定义内部重写使用精确匹配规则,不会误拦截其他路径的请求
修改配置后请清空浏览器缓存再测试,避免之前的302跳转缓存影响验证结果。
内容的提问来源于stack exchange,提问作者Finlay
相关产品推荐
相关产品推荐

