apache rewriterule 关键在匹配准、替换对、标志恰到好处,本质是内部重写使浏览器地址栏不变、利于seo;须先启用模块、设置allowoverride all、重启服务、首行rewriteengine on,再按rewriterule 模式 目标 [标志] 编写,模式不加开头斜杠,常用lqsa。

Apache RewriteRule 规则不是写得越多越好,关键在匹配准、替换对、标志用得恰到好处。它本质是让服务器内部悄悄把用户请求的路径转给对应脚本处理,浏览器地址栏不变,既友好又利于 SEO。
先让环境跑起来
规则再正确,环境没配好也白搭:
- 启用 mod_rewrite 模块:Linux 下运行 sudo a2enmod rewrite(Debian/Ubuntu)或编辑 httpd.conf 取消
LoadModule rewrite_module modules/mod_rewrite.so前的注释(CentOS/RHEL) - 授权目录级重写:找到对应站点的
<directory></directory>区块,把 AllowOverride None 改成 AllowOverride All,并确保 Options +FollowSymLinks - 重启 Apache:执行 systemctl restart apache2 或 apachectl restart
- 在站点根目录新建 .htaccess 文件,首行必须写 RewriteEngine On
写规则的核心语法
RewriteRule 固定格式为:RewriteRule 模式 目标 [标志],三部分缺一不可:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
模式 是正则表达式,只匹配 URL 路径部分(不含域名和 ? 后参数),开头不用加斜杠(
^article/...,不是^/article/...) -
目标 是实际要调用的文件路径,可含捕获组引用(如
$1、$2),以/开头表示从网站根目录算起 -
常用标志:
[L]表示终止后续规则匹配;[NC]不区分大小写;[QSA]自动保留原始查询参数;[R=301]发送外部重定向(地址栏会变)
几种典型场景写法
不同目的要用不同组合,错一个标志可能引发无限循环或 404:
-
伪静态映射(如
/news/123→news.php?id=123):RewriteRule ^news/([0-9]+)$ /news.php?id=$1 [L,QSA,NC] -
强制 HTTPS(外部跳转):
RewriteCond %{HTTPS} off<br>RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] -
屏蔽直接访问 .php 文件:
RewriteCond %{THE_REQUEST} \.php[\s?]<br>RewriteRule \.php$ - [F,L] -
排除真实文件和目录(避免干扰静态资源):
RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d
调试时看什么
别只靠刷新页面猜,重点验证两个地方:
- 访问目标 URL(比如
/product/abc/2026),页面内容正常加载且地址栏没跳转——说明是内部重写成功 - 查 Apache 错误日志(
logs/error_log),常见报错如 “bad flag delimiters” 多因方括号格式错误或空格缺失 - 用
apache2ctl -M | grep rewrite确认模块真正在运行










