核心是通过 apache 的 .htaccess 实现内部转发:启用 mod_rewrite 并设 allowoverride all 后,用 rewritecond 判断请求非真实文件或目录,再以 rewriterule ^ index.html [l] 将所有路径内部转发至 index.html,由前端 js(如 vue router history 模式)接管路由,保持 url 不变且静态资源正常加载。

Apache URL 重写实现单页面应用(SPA)路由,核心是让服务器把所有“非真实资源”的请求都交给 index.html 处理,由前端 JavaScript(如 Vue Router、React Router 或原生 history API)接管后续路由逻辑。关键不在于重定向,而是在服务端做一次内部转发(Internal Rewrite),保持浏览器地址栏不变。
确保 Apache 开启 mod_rewrite 并允许 .htaccess
这是前提,否则规则不会生效:
- 确认
mod_rewrite已启用:在 Apache 配置中检查LoadModule rewrite_module modules/mod_rewrite.so是否取消注释 - 确保网站目录的
AllowOverride设置为All(不是默认的None),否则.htaccess文件被忽略 - 若用虚拟主机配置,需在
<directory></directory>块中显式设置:AllowOverride All
在项目根目录放置 .htaccess 文件
内容简洁明确,只保留必要规则:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]
-
RewriteEngine On:启用重写引擎 -
RewriteBase /:设定重写基准路径(尤其当 SPA 部署在子目录时需调整,如/myapp/) - 两个
RewriteCond:仅当请求路径**不是真实文件(!-f)且不是真实目录(!-d)**时才触发重写,避免干扰 CSS、JS、图片等静态资源 -
RewriteRule ^ index.html [L]:匹配任意路径(^表示开头),内部转发到index.html;[L]表示“最后一条规则”,不再继续匹配
前端代码需配合 history 模式
服务端转发只是第一步,前端必须使用基于 HTML5 History API 的路由模式(而非 hash 模式):
- Vue Router:设
mode: 'history',并确保base与RewriteBase一致 - React Router v6:使用
createBrowserRouter,无需额外配置,但部署路径需与服务器一致 - 纯 JS:监听
popstate事件,用history.pushState()管理导航 - 注意:首次加载和直接访问深层路由(如
/about)时,index.html被正确返回,JS 才能启动并解析window.location.pathname
常见问题与验证要点
部署后快速排查是否生效:
- 直接在浏览器访问一个前端路由路径(如
/dashboard),应正常显示页面,而不是 404 - 检查网络面板:该请求返回的是
index.html(状态码 200),而非重定向(301/302) - 静态资源(
/assets/main.js、/logo.png)仍能正常加载——说明!-f和!-d条件起效 - 如果报 500 错误,检查 Apache 错误日志,大概率是
AllowOverride未放开或语法错误 - 若部署在子目录(如
https://example.com/my-spa/),需同步设置RewriteBase /my-spa/和前端路由的base










