CodeIgniter 3生产服务器部署问题:请求重定向及Session异常
嘿,我来帮你排查这两个头疼的问题——静态资源被重定向到首页、Session失效,这俩在CodeIgniter生产部署时确实挺常见的,咱们一步步来解决:
这个问题大概率是URL重写规则没写对,导致静态资源也被转发到了CodeIgniter的入口文件,先从这几个关键点排查:
检查
config.php的核心配置
首先确保基础URL和入口页设置正确:// 替换成你的实际域名,末尾要加斜杠 $config['base_url'] = 'http://XXXXX.local/'; // 空字符串表示用.htaccess去掉index.php $config['index_page'] = '';修正
.htaccess的重写规则(重点!)
很多人写的规则会把已存在的静态文件也重定向到首页,正确的规则应该只转发「不存在的文件/目录」到index.php,这样assets下的js、css就能直接被服务器返回:RewriteEngine On RewriteBase / # 跳过已存在的文件和目录(这两行是关键!) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 把请求转发到index.php处理 RewriteRule ^(.*)$ index.php/$1 [L]注意:如果你的项目部署在子目录里,
RewriteBase要改成对应的路径,比如/my-project/。确认Apache虚拟主机配置
必须开启AllowOverride All,否则.htaccess的规则根本不会生效:<VirtualHost *:80> ServerName XXXXX.local # 这里要指向包含index.php的项目根目录 DocumentRoot /var/www/html/your-codeigniter-project <Directory /var/www/html/your-codeigniter-project> Options Indexes FollowSymLinks AllowOverride All # 一定要开这个 Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/ci-project-error.log CustomLog ${APACHE_LOG_DIR}/ci-project-access.log combined </VirtualHost>改完配置后记得重启Apache:
sudo systemctl restart apache2
Session失效通常和存储路径权限、配置参数有关,按下面步骤排查:
检查
config.php的Session配置
以文件存储驱动为例,确保这些参数设置正确:$config['sess_driver'] = 'files'; // 这个目录要手动创建,并且给Apache用户读写权限 $config['sess_save_path'] = APPPATH . 'sessions/'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; // 域名前加个点,方便子域名共享(如果有的话) $config['cookie_domain'] = '.XXXXX.local'; $config['cookie_path'] = '/'; $config['cookie_secure'] = FALSE; // 生产环境用HTTPS的话改成TRUE $config['cookie_httponly'] = TRUE;修复Session存储目录的权限
如果用文件驱动,application/sessions/目录必须让Apache的运行用户(通常是www-data)能读写:sudo chown -R www-data:www-data /var/www/html/your-codeigniter-project/application/sessions sudo chmod -R 700 /var/www/html/your-codeigniter-project/application/sessions确保Session库正确加载
要么在config/autoload.php里自动加载:$autoload['libraries'] = array('session');要么在控制器里手动加载:
$this->load->library('session');另外设置和读取Session的语法要正确:
// 设置Session $this->session->set_userdata('user_id', 123); // 读取Session echo $this->session->userdata('user_id');
如果按上面的步骤操作后还是有问题,建议去看Apache的错误日志(/var/log/apache2/ci-project-error.log)和CodeIgniter的日志(application/logs/),里面会有更详细的报错信息,帮你精准定位问题。
内容的提问来源于stack exchange,提问作者notnotundefined

