求助:.htaccess的mod_rewrite规则不生效,需实现URL路径映射
解决mod_rewrite规则不生效的问题
嘿,我瞅你这mod_rewrite的规则有点小问题,咱来一步步捋顺。你说正则工具匹配正常但Apache没反应,大概率是规则里的循环问题或者路径写法不对,先看原规则的几个坑:
原规则RewriteRule ^.*\/user\/(.+)*$ ./foo/bar/user/$1存在这些问题:
^.*\/user\/里的.*是贪婪匹配,会抓从开头到最后一个/user/的所有内容,容易误匹配其他包含/user/的路径;而且末尾的*完全多余,(.+)已经能匹配一个或多个字符了。- 目标路径用
./相对路径,Apache处理时可能因上下文产生歧义,不如直接用根目录开头的绝对路径靠谱。 - 最关键的是没防止循环重写:把
/user/name重写到/foo/bar/user/name后,新URI又会匹配到规则,导致Apache内部循环,最后要么返回错误,要么干脆不处理。
给你修正后的规则,分两种场景:
场景1:希望用户看到URL变化(外部重定向)
如果想让浏览器地址栏从/user/name变成/foo/bar/user/name,用这个:
Options +FollowSymLinks RewriteEngine on # 防止循环:已经是foo/bar/user开头的请求不再重写 RewriteCond %{REQUEST_URI} !^/foo/bar/user/ # 匹配开头是user/的路径,重写到目标地址 RewriteRule ^user/(.+)$ /foo/bar/user/$1 [L,R=301]
场景2:不想让用户看到URL变化(内部转发)
如果只是内部映射,浏览器地址栏保持/user/name,实际访问后端的/foo/bar/user/name,去掉R=301即可:
Options +FollowSymLinks RewriteEngine on RewriteCond %{REQUEST_URI} !^/foo/bar/user/ RewriteRule ^user/(.+)$ /foo/bar/user/$1 [L]
额外排查要点
- 先确认Apache已启用mod_rewrite:Ubuntu/Debian可以跑
sudo a2enmod rewrite,CentOS/RHEL要检查httpd.conf里的LoadModule rewrite_module行有没有被注释。 - 确保网站根目录的Apache配置里设置了
AllowOverride All,不然.htaccess根本不会生效。 - 测试时先用
R=302临时重定向,确认规则没问题再改成R=301永久重定向,避免浏览器缓存旧规则坑自己。
内容的提问来源于stack exchange,提问作者Radosav227
相关产品推荐
相关产品推荐

