rewriterule本质是匹配路径、替换目标、控制行为的内部重写指令,需先配环境(启用模块、allowoverride all、重启)、再写规则(rewriteengine on开头,模式不加开头斜杠,用[l]等标志精准控制),确保浏览器地址栏不变且seo友好。

Apache 的 RewriteRule 重写规则本质是“匹配路径 + 替换目标 + 控制行为”,关键不在写得多,而在写得准。它不依赖外部跳转,而是让服务器内部把用户请求的 URL 按规则悄悄转给对应脚本处理,浏览器地址栏不变,对 SEO 和用户体验更友好。
先确保环境能跑起来
规则再正确,环境没配好也无效:
- 打开 httpd.conf,取消注释:
LoadModule rewrite_module modules/mod_rewrite.so - 找到网站根目录对应的
区块,把 AllowOverride None改成AllowOverride All - 重启 Apache(
systemctl restart httpd或apachectl restart) - 在站点根目录新建 .htaccess 文件,首行必须写:
RewriteEngine On
基础语法和正则要点
RewriteRule 格式固定为:RewriteRule 模式 目标 [标志]。其中模式是正则表达式,只匹配 URL 路径部分(不含域名和查询参数)。
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
-
^表示开头,$表示结尾,例如^/article/([0-9]+)\.html$精确匹配以/article/开头、数字加.html结尾的路径 -
(...)是捕获组,里面的内容可用$1、$2引用;[0-9]+匹配一个或多个数字,[^/]+匹配不含斜杠的任意字符 - 避免常见错误:路径开头不要加多余斜杠(
^/foo在 .htaccess 中应写为^foo),因为 .htaccess 的上下文已剥离了目录前缀
常用场景与对应写法
不同目的对应不同标志组合,选错可能造成无限循环或 404:
-
伪静态映射(如
/news/123→news.php?id=123):RewriteRule ^news/([0-9]+)$ /news.php?id=$1 [L,QSA,NC]
加[QSA]可保留原始 URL 中的 ?utm_source=xxx 等参数 -
强制 HTTPS 跳转:
RewriteCond %{HTTPS} offRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
注意用R=301发送永久重定向,避免搜索引擎重复收录 -
屏蔽恶意访问(如禁止直接访问 .php 文件):
RewriteCond %{THE_REQUEST} \.php[\s?]RewriteRule \.php$ - [F,L][F]直接返回 403 禁止访问
调试与验证技巧
规则写完别急着上线,先确认是否按预期工作:
- 访问目标 URL(如
/product/apple/2026),检查页面内容是否正常加载,且地址栏未跳转——说明是内部重写而非重定向 - 查看 Apache 错误日志(
logs/error_log),常见报错如 “RewriteRule: bad flag delimiters” 多因方括号格式错误或空格缺失 - 临时添加
RewriteLog "/path/to/rewrite.log"和RewriteLogLevel 3(仅限开发环境),可追踪每一步匹配过程 - 用在线正则测试工具(如 regex101.com)验证你的模式是否匹配预期路径,注意 Apache 使用的是 PCRE 引擎










