将Symfony从开发环境部署至生产环境遇阻求助
看起来你遇到的核心问题是服务器没正确识别Symfony的入口文件,导致跳转到了主机的默认广告页。我结合1&1主机的特性和Symfony部署的常见坑,给你一步步梳理排查方案:
1. 先确认文档根目录的指向问题
1&1的共享主机默认把public_html(或www)作为网站的文档根目录,而Symfony的入口文件是在项目的public文件夹里的index.php。你现在直接访问www.my-web-sites/symfony-demo,服务器会去这个目录找默认索引文件(比如index.html),但Symfony根目录里没有这个,所以才会显示广告页。
解决思路:
- 方案一(推荐):把
symfony-demo/public里的所有文件/文件夹移动到服务器的public_html目录下,然后把symfony-demo的其他核心目录(src、vendor、var、.env等)放在public_html的同级目录(比如/home/your-user/symfony-demo),这样既符合Symfony的安全规范,又能让服务器直接找到入口文件。 - 方案二:如果你的1&1主机支持自定义文档根目录,可以在主机控制面板的域名设置里,把域名指向
symfony-demo/public这个路径(部分1&1套餐支持这个功能,找“网站配置”或“域名映射”选项)。
2. 修正.htaccess的配置错误
你提到把Apache的VirtualHost配置放进了.htaccess,这是不对的——VirtualHost是服务器全局配置项,不能写在目录级的.htaccess里。正确的.htaccess应该是composer require symfony/apache-pack后自动生成在public目录里的那一份,内容如下:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$ RewriteRule .* - [E=BASE:%1] RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] RewriteCond %{ENV:REDIRECT_STATUS} ="" RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ %{ENV:BASE}/index.php [L] </IfModule>
确保这个.htaccess文件在服务器的public目录下,同时确认1&1主机开启了mod_rewrite模块(可以上传一个phpinfo.php文件,内容<?php phpinfo(); ?>,访问后搜索mod_rewrite确认)。
3. 修复文件权限问题
Linux主机对权限要求严格,Symfony的var目录需要有写权限来生成缓存和日志。上传完成后检查:
- 把
var目录及其子目录的权限设为755,文件设为644; - 如果还是有权限报错,可以把
var目录的所有者改成服务器的运行用户(1&1的Apache运行用户通常是www-data,可以通过上传一个PHP文件执行<?php echo exec('whoami'); ?>来查看)。
如果有SSH权限,直接执行命令:
chmod -R 755 var/ chown -R www-data:www-data var/
没有SSH的话,用FTP客户端右键修改权限即可。
4. 确保生产环境的缓存和依赖正确
你本地改了APP_ENV=prod,但如果没生成生产环境缓存就上传,服务器会无法正常加载。正确的步骤应该是:
- 本地执行
composer install --no-dev --optimize-autoloader,移除开发依赖并优化自动加载; - 本地执行
php bin/console cache:clear --env=prod --no-debug,生成生产环境的缓存文件; - 再把整个项目(包括生成的
var/cache/prod)上传到服务器。
如果已经上传了文件,且有SSH权限,直接在服务器的项目根目录执行上面两个命令也可以。
5. 验证服务器的PHP版本和扩展
Symfony 4要求PHP 7.1.3及以上版本,1&1部分老套餐可能默认PHP版本偏低。上传phpinfo.php查看:
- 确认PHP版本符合要求;
- 检查是否安装了Symfony必需的扩展:
mbstring、xml、json、ctype等,缺失的话在1&1控制面板的PHP设置里开启。
内容的提问来源于stack exchange,提问作者user3425506

