如何正确实现URL重写?现有Rewrite规则不生效该如何调整?
Apache mod_rewrite 重写规则排查与调整方案
排查步骤
- 确认
mod_rewrite模块已启用:查看Apache主配置文件中LoadModule rewrite_module modules/mod_rewrite.so行是否取消注释,重启Apache后执行apache2ctl -M(CentOS系统执行httpd -M),确认输出列表中存在rewrite_module - 确认目录
AllowOverride配置正确:找到Apache配置中对应top_admin目录的<Directory>段,确认AllowOverride参数设置为All,设置为None时.htaccess文件不会生效 - 确认
.htaccess存放位置正确:原规则默认适配top_admin目录下的.htaccess,如果文件放在站点根目录,规则需要补全路径前缀
规则调整说明
原规则存在两处适配缺陷:
- 未匹配URL末尾可选的斜杠,用户访问
order/view/124(不带末尾斜杠)时无法匹配 (.*)通配范围过大,可能意外匹配多级路径,同时缺少QSA标记会丢失原URL携带的额外查询参数
调整后规则(.htaccess放在top_admin目录下)
Options +FollowSymLinks RewriteEngine on RewriteRule ^order/([a-zA-Z0-9_]+)/([0-9]+)/?$ order.php?do=$1&oid=$2 [L,QSA]
调整后规则(.htaccess放在站点根目录下)
Options +FollowSymLinks RewriteEngine on RewriteRule ^top_admin/order/([a-zA-Z0-9_]+)/([0-9]+)/?$ /top_admin/order.php?do=$1&oid=$2 [L,QSA]
生效验证
- 开启重写日志定位问题:Apache 2.4及以上版本可在虚拟主机配置中添加
LogLevel alert rewrite:trace3,查看Apache错误日志中的重写匹配流程,可快速定位规则不匹配的原因 - 调整后清理浏览器缓存再测试,永久重定向规则会被浏览器缓存,可能导致修改后无法立即看到效果
内容的提问来源于stack exchange,提问作者Travis
相关产品推荐
相关产品推荐

