Symfony 4中路由在调试列表存在但访问返回404问题
解决Symfony 4路由存在但Apache返回404的问题
你遇到的核心问题很明确:请求根本没被转发到Symfony的前端控制器(public/index.php)——毕竟如果是Symfony处理的请求,哪怕路由配置有问题,也会返回Symfony自带的404页面,而非Apache原生的404报错。结合你的场景,给你几个针对性的排查和解决步骤:
1. 检查Apache虚拟主机的DocumentRoot指向
很多人容易踩这个坑:把虚拟主机的DocumentRoot指向Symfony项目的根目录,而非项目下的public文件夹。你的虚拟主机配置文件(Ubuntu下通常在/etc/apache2/sites-available/目录中)必须这样设置:
<VirtualHost *:80> ServerName new.staff-fdr.dev # 重点:这里必须指向项目的public目录 DocumentRoot /绝对路径/到你的symfony项目/public <Directory /绝对路径/到你的symfony项目/public> AllowOverride All Require all granted # 开启重写引擎,将非静态文件请求转发给index.php RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </Directory> ErrorLog ${APACHE_LOG_DIR}/new.staff-fdr.dev-error.log CustomLog ${APACHE_LOG_DIR}/new.staff-fdr.dev-access.log combined </VirtualHost>
修改完成后,记得启用站点(如果未启用):sudo a2ensite 你的站点配置文件名.conf,然后重启Apache:sudo systemctl restart apache2。
2. 确保Apache的mod_rewrite模块已启用
Symfony的路由重写完全依赖这个模块,Ubuntu下执行以下命令启用:
sudo a2enmod rewrite sudo systemctl restart apache2
3. 验证public目录下的.htaccess文件
Symfony 4默认会在public目录生成.htaccess文件,负责将所有非静态文件的请求转发给index.php。如果这个文件丢失或内容错误,也会导致请求无法到达Symfony。正常的文件内容应该是这样的:
RewriteEngine On RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$ RewriteRule ^ - [E=BASE:%1] RewriteCond %{HTTP:Authorization} . RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{ENV:REDIRECT_STATUS} ="" RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L] RewriteRule ^ %{ENV:BASE}/index.php [L]
如果文件不存在,手动创建并粘贴上述内容即可。
补充:为什么debug:router能看到路由,但访问不了?
因为bin/console debug:router是直接读取Symfony内部的路由配置,完全不依赖Web服务器的设置——它只负责告诉你Symfony能识别哪些路由,但如果Web服务器没把请求传给Symfony,这些路由自然无法被访问到。
内容的提问来源于stack exchange,提问作者Riza
相关产品推荐
相关产品推荐

