CodeIgniter控制器仅index()可用,其他函数返回404 Not Found问题
解决Nginx下CodeIgniter控制器方法404问题
看起来你遇到的是Nginx环境下CodeIgniter(从URL结构判断大概率是这个框架)的URL路由问题,别着急,咱们一步步来排查解决:
1. 检查Nginx的Rewrite规则(最关键)
Nginx不像Apache有.htaccess自动处理URL重写,必须在server配置块里手动添加规则,确保所有请求都能转发到index.php入口文件。
打开你的Nginx站点配置文件(通常在/etc/nginx/sites-available/或/etc/nginx/conf.d/目录下),修改或添加对应的server块配置:
server { listen 80; server_name 163.XX.XXX.XX; # 替换成你的API项目实际根目录,比如/var/www/html/API root /path/to/your/API/project; index index.php index.html; # 处理API路径下的所有请求 location /API { # 先尝试访问静态文件,找不到就转发到index.php try_files $uri $uri/ /API/index.php$is_args$args; } # PHP处理规则,确保PHP文件能被正确解析 location ~ \.php$ { # 根据你的PHP版本和FPM配置调整,比如php8.0-fpm.sock fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
修改完后,记得重载Nginx配置让它生效:
sudo nginx -s reload
2. 调整CodeIgniter的配置
打开项目的application/config/config.php文件:
- 确保
$config['base_url']设置正确:$config['base_url'] = 'http://163.XX.XXX.XX/API/'; - 把
$config['index_page']设为空字符串,让框架自动去掉URL里的index.php:$config['index_page'] = ''; - 你已经设置了
$config['uri_protocol'] = 'REQUEST_URI';,这个是正确的,无需修改。
3. 验证控制器规范
虽然你说类名大小写一致,但再确认下:
- 控制器文件名必须是首字母大写,比如
ApiController.php(注意后缀是.php) - 类名和文件名完全一致,且继承CI_Controller:
class ApiController extends CI_Controller { public function index() { echo "Hello World"; } public function getTs() { echo "Hello again"; } }
4. 测试两种URL格式
现在试试访问这两个URL:
- 不带
index.php的:http://163.XX.XXX.XX/API/ApiController/getTs - 如果还是有问题,先测试兼容模式:
http://163.XX.XXX.XX/API/index.php?/ApiController/getTs
如果兼容模式能正常返回,说明就是Nginx的rewrite规则没配置对,回到第一步重新检查规则即可。要是还有疑问,也可以看看Nginx的错误日志(/var/log/nginx/error.log),里面会有更详细的错误信息帮你定位。
内容的提问来源于stack exchange,提问作者Alkatell
相关产品推荐
相关产品推荐

