如何在AWS Elastic Beanstalk部署CodeIgniter?部署后403/404错误求助
嘿,刚上手Elastic Beanstalk就碰到这种访问错误确实头疼,结合你说的情况(本地和其他Linux服务器正常、控制器首字母已大写),我给你梳理几个最可能的原因和解决办法:
先搞定403 Forbidden(根路径访问失败)
这个问题大概率是文档根目录配置不对或者权限不足:
1. 调整EB的文档根目录指向CodeIgniter的public文件夹
CodeIgniter的入口文件是public/index.php,但Elastic Beanstalk默认会把项目根目录设为文档根,导致apache找不到可访问的入口文件,就会返回403。你需要通过.ebextensions配置文件修改这个设置:
在项目根目录创建.ebextensions/01_set_document_root.config,内容如下:
files: "/etc/httpd/conf.d/elasticbeanstalk.conf": mode: "000644" owner: root group: root content: | <VirtualHost *:80> DocumentRoot /var/www/html/public <Directory /var/www/html/public> Options FollowSymLinks Indexes AllowOverride All Require all granted </Directory> ErrorLog /var/log/httpd/elasticbeanstalk-error_log </VirtualHost>
(注:如果是Amazon Linux 2的EB环境,这个路径和配置是适用的;如果是旧版Amazon Linux,路径可能略有不同,但核心是把DocumentRoot指向public)
2. 修复文件权限
EB部署后,EC2实例上的文件权限可能不是apache用户(通常是apache或www-data)可读写的,导致无法访问。同样在.ebextensions里加权限配置:
创建.ebextensions/02_set_permissions.config:
container_commands: 01_set_apache_permissions: command: "chown -R apache:apache /var/www/html && chmod -R 755 /var/www/html/public"
再解决404 Not Found(/login路径失败)
这个问题和你的.htaccess配置、CodeIgniter的系统设置密切相关:
1. 修正.htaccess的Rewrite规则
你贴的.htaccess不完整,而且RewriteBase /sample是本地WAMP的子目录配置,在EB上你的环境是独立域名,根路径就是/,所以要调整成CodeIgniter标准的rewrite规则:
把项目根目录(或者public文件夹里,看你把.htaccess放哪)的.htaccess改成:
<IfModule mod_rewrite.c> Options +FollowSymLinks Options +Indexes RewriteEngine On RewriteBase / # 忽略实际存在的文件和目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 把所有请求转发到index.php RewriteRule ^(.*)$ index.php/$1 [L] </IfModule>
2. 确保EB启用了mod_rewrite模块
默认情况下EB的apache可能没开rewrite模块,需要手动启用。在.ebextensions里加配置:
创建.ebextensions/03_enable_rewrite.config:
files: "/etc/httpd/conf.d/rewrite.conf": mode: "000644" owner: root group: root content: | LoadModule rewrite_module modules/mod_rewrite.so
3. 检查CodeIgniter的config.php配置
打开application/config/config.php,确认这几个关键配置:
$config['base_url']:设置成你的EB域名,比如https://sample.elasticbeanstalk.com/(注意末尾的斜杠)$config['index_page']:设为空字符串'',这样rewrite规则才能去掉index.php$config['uri_protocol']:推荐设为'REQUEST_URI',确保路由解析正常
4. 最后确认控制器和方法
虽然你说控制器首字母大写了,但再检查一遍:
- 控制器文件必须是
Login.php(首字母大写) - 文件里的类名必须是
class Login extends CI_Controller(和文件名一致,首字母大写) - 如果访问
/login,控制器里必须有index()方法;如果是访问特定方法,比如/login/do_login,那要有do_login()方法
把这些配置都调整好后,重新部署你的应用到EB,应该就能解决这两个错误了。
内容的提问来源于stack exchange,提问作者irish

