
本文详解 htaccess 中 rewriterule 失效的常见原因及修复方法,重点解决“/show_article/17”无法重写为“/show_article.php?article_id=17”的问题,涵盖规则语法、路径匹配、标志位使用与调试要点。
本文详解 htaccess 中 rewriterule 失效的常见原因及修复方法,重点解决“/show_article/17”无法重写为“/show_article.php?article_id=17”的问题,涵盖规则语法、路径匹配、标志位使用与调试要点。
在 Apache 的 .htaccess 文件中,RewriteRule 不生效是开发者常遇到的问题。您当前的配置存在多个关键错误,导致重写逻辑未被触发或执行失败。
? 主要问题分析
-
路径前缀错误:
RewriteRule ^/show_article/([0-9]+)\.php中的开头斜杠/在.htaccess上下文中是非法的(仅在服务器级httpd.conf中有效),应去掉; -
目标路径不匹配需求:您希望用户访问
/show_article/17(无.php后缀),但规则却匹配带.php的路径,且目标指向/show_article.php?...,而实际文件可能是show_article.php(注意路径层级); -
缺少必要重写标志:未使用
[L](Last)终止后续规则,也未加[QSA]保留原有查询参数(虽本例暂无,但属良好实践); -
RewriteBase与实际目录不一致:若网站部署在子目录(如https://mysite.com/mysite/),RewriteBase /会导致路径解析错误;若站点根目录即文档根,则RewriteBase /正确,但需确保规则路径与之匹配; -
MultiViews干扰:-MultiViews禁用内容协商是合理的,但Options +FollowSymLinks已足够,无需-MultiViews(除非明确需要禁用)。
✅ 推荐修正配置(适配您的目标)
假设您的 PHP 文件位于网站根目录下,文件名为 show_article.php,且希望实现:
- 用户访问:
https://mysite.com/show_article/17 - 内部重写为:
/show_article.php?article_id=17
请将 .htaccess 替换为以下内容:
# BEGIN Friendly URL Rewrite Options +FollowSymLinks RewriteEngine On RewriteBase / # 将 /show_article/123 → /show_article.php?article_id=123 RewriteRule ^show_article/(\d+)$ show_article.php?article_id=$1 [QSA,L] # END
? 注意:
^show_article/(\d+)$匹配的是URL 路径部分(不含域名和查询字符串),因此https://mysite.com/show_article/17中的/show_article/17完全匹配该正则。
Apache 2.4.62下载Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
⚠️ 关键注意事项
-
启用 mod_rewrite:确保 Apache 已加载
rewrite_module(Linux 常通过a2enmod rewrite启用,Windows 检查httpd.conf中LoadModule rewrite_module是否启用); -
AllowOverride 权限:虚拟主机配置中必须设置
AllowOverride All(或至少AllowOverride FileInfo),否则.htaccess中的重写指令将被忽略; - 缓存干扰:浏览器可能缓存 301 重定向或旧响应,请务必使用无痕窗口测试,或在 Chrome 开发者工具中勾选 Disable cache;
-
PHP 文件存在性验证:确保
show_article.php真实存在于网站根目录,且有可读权限; -
调试技巧:临时添加
RewriteLog(Apache LogLevel alert rewrite:trace3(Apache ≥ 2.4)查看重写过程日志(需管理员权限)。
? 进阶建议(可选)
若需支持多级路径(如 /show_article/17/title-slug)或统一处理所有 ID 类路由,可扩展为:
# 支持带可选 slug 的路由(slug 被忽略,仅用于 SEO) RewriteRule ^show_article/(\d+)(?:/[^/]+)?$ show_article.php?article_id=$1 [QSA,L]
最后,请始终以 https://mysite.com/show_article/17 形式在 HTML 中书写链接(而非 ?article_id=17),才能真正发挥重写优势——既提升 SEO 友好性,又隐藏后端参数结构。
正确配置后,Apache 将静默完成内部映射,用户地址栏显示干净 URL,服务端脚本仍可通过 $_GET['article_id'] 获取值,一切无缝衔接。











