配置Symfony不将子目录视为路由部分及Apache部署问题
你遇到的核心问题是Apache没有正确将请求导向Symfony的public/index.php入口文件,同时Symfony未识别到子目录作为基础路径。下面是一步步的实操解决方案:
1. 先启用Apache的mod_rewrite模块
Symfony的URL重写完全依赖这个模块,先执行以下命令启用并重启服务:
sudo a2enmod rewrite sudo systemctl restart apache2
2. 让Apache将子目录请求转发到Symfony的public目录
你的项目放在/var/www/html/myproject,但Symfony的入口是public/index.php,我们需要把/myproject的所有请求都转发到public子目录,有两种实现方式:
方式一:修改Apache站点配置文件
编辑默认站点配置(路径通常是/etc/apache2/sites-available/000-default.conf),在<VirtualHost *:80>块内添加以下配置:
<Directory /var/www/html/myproject> Options FollowSymLinks AllowOverride All Require all granted RewriteEngine On # 将所有请求转发到public目录 RewriteRule ^(.*)$ public/$1 [L] </Directory>
保存后重启Apache生效:
sudo systemctl restart apache2
方式二:在项目根目录添加.htaccess文件
如果不想改动Apache全局配置,可以直接在/var/www/html/myproject目录下新建一个.htaccess文件,写入以下内容:
RewriteEngine On # 根路径请求转发到public RewriteRule ^$ public/ [L] # 所有其他请求转发到public目录 RewriteRule (.*) public/$1 [L]
3. 调整public目录下的.htaccess配置
打开/var/www/html/myproject/public/.htaccess,找到RewriteBase行(如果被注释就取消注释),修改为你的子目录路径:
RewriteBase /myproject/public/
这一步能确保Symfony路由系统正确识别基础路径,不会把子目录误判为路由的一部分。
4. 验证Apache默认索引设置
确保Apache的DirectoryIndex包含index.php,这样访问/myproject/public时会自动加载入口文件。可以在Apache全局配置(/etc/apache2/apache2.conf)或站点配置中添加:
DirectoryIndex index.php index.html index.htm
完成以上步骤后,再访问http://192.168.0.2/myproject,应该就能正常进入Symfony应用,而不是看到文件夹列表了。
内容的提问来源于stack exchange,提问作者gmponos

