本质是重写规则误将静态资源请求转发给PHP脚本,解决关键是让静态资源绕过重写:添加RewriteCond %{REQUEST_FILENAME} !-f和!-d条件,或显式排除assets|css|js|images等路径,并确认mod_rewrite启用、AllowOverride All及DocumentRoot指向正确。
apache url 重写后静态资源(css、js、图片)加载失败,本质是重写规则“误伤”了本该直接返回文件的请求。不是资源不存在,而是请求被错误地转发给了 php 脚本或跳转到了错误路径。核心解决思路是:让静态资源绕过重写逻辑,直通物理文件。
检查并排除 assets、css、js、images 等静态目录
最常见的错误是用一条宽泛规则(如 RewriteRule ^(.*)$ index.php [L])捕获所有路径,连 /assets/img/logo.png 也被重写。必须显式豁免这些路径:
- 在
RewriteEngine On后添加:RewriteCond %{REQUEST_FILENAME} !-f(文件存在则不重写) - 再加:
RewriteCond %{REQUEST_FILENAME} !-d(目录存在也不重写) - 或者更精准地排除前缀:
RewriteRule ^(assets|css|js|images|fonts)/ - [L]
确认 mod_rewrite 已启用且 .htaccess 生效
规则写对了,但没执行,等于白搭:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 运行
a2enmod rewrite并重启 Apache,确保模块已加载 - 检查对应目录的虚拟主机配置,确认
AllowOverride All或至少包含FileInfo - 验证
.htaccess文件权限为 644,且位于正确目录(如 Laravel/ThinkPHP 的public/下)
避免 server.php 入口干扰(Laravel 专属)
如果浏览器控制台显示请求地址是 /server.php/css/app.css,说明 Apache 没走 public/index.php,而是误用了开发服务器入口:
-
立刻删除或重命名
server.php—— 它仅用于php -S本地测试,生产环境完全无效 - 确保 DocumentRoot 指向
your-project/public,而非项目根目录 - 确认
public/.htaccess存在且内容含标准 Laravel 重写规则(含RewriteBase /)
检查是否被代理或反向代理干扰
若 Apache 前面还有 Nginx 或 CDN,静态资源路径可能被二次改写:
- 前端 HTML 中避免硬编码绝对路径(如
href="/css/app.css"),改用相对路径或动态生成带前缀的 URL - 代理配置中启用
ProxyPreserveHost On,防止 Host 头丢失导致路径解析错乱 - 检查响应头中的
Location字段,若静态资源返回 301/302 重定向到根路径,说明重写规则触发了意外跳转

















