symfony 2 在 apache 上出现不必要 404,主因是请求未进入 symfony 入口文件,需确保 .htaccess 正确启用(allowoverride all)、置于 web/public 目录、权限为 644,并采用官方重写规则(含 qsa 标志)及子目录部署时设置 rewritebase。

Symfony 2 在 Apache 上出现不必要 404,多数不是路由没定义,而是请求根本没进到 Symfony 的入口(web/app.php 或 public/index.php),被 Apache 拦在了外面。关键在于重写规则是否让所有合法请求都正确转发给 PHP 入口文件,同时避免误判真实存在的静态资源。
确保 .htaccess 正确启用并生效
Apache 必须允许目录级重写,且 .htaccess 文件本身可读、位置正确:
- 确认虚拟主机配置中对应目录启用了
AllowOverride All,例如:<directory><br> AllowOverride All<br> Require all granted<br></directory>
- 检查
.htaccess是否放在 Symfony 的 web 根目录(如web/或public/)下,而非项目根目录 - 文件权限设为
644,确保 Apache 用户(如www-data)能读取
使用标准且健壮的重写规则
不要自行拼凑规则,优先采用 Symfony 官方推荐或经验证的最小安全模板:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 若用
web/app.php入口(Symfony 2.8 及之前):RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteRule ^(.*)$ app.php [QSA,L] - 若已升级至
public/index.php(兼容 Symfony 2.8+ 的现代结构):RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteRule ^(.*)$ index.php [QSA,L] - 务必包含
[QSA]—— 否则查询参数(如?_path=/admin)会丢失,导致路由匹配失败
排除子目录部署的路径偏移
站点若不在域名根路径下(例如部署在 https://example.com/myapp/),必须显式设置 RewriteBase:
- 在
.htaccess开头添加:RewriteBase /myapp/ - 否则 Apache 会把重写目标解释为
/index.php(从根开始),而实际文件在/myapp/index.php,结果 404 - 注意末尾斜杠不能省略,且必须与 URL 中的路径完全一致
验证重写是否真正触发
别只看页面效果,直接测试重写引擎本身是否工作:
- 新建一个
test.php放在 web 目录,内容为<?php echo 'ok'; ?> - 临时加一条测试规则:
RewriteRule ^hello$ test.php [L] - 访问
/hello,能输出ok即说明重写模块启用、配置可执行 - 若仍 404,检查
mod_rewrite是否启用:a2enmod rewrite && systemctl restart apache2










