You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter图片文件名整参传递及Ubuntu服务器404问题咨询

问题原因与解决方案

这个问题的核心是Apache服务器的AcceptPathInfo配置差异,以及CodeIgniter对URI的解析逻辑导致的:

为什么本地MAMP正常,远程Ubuntu服务器不行?

MAMP默认的Apache配置里AcceptPathInfo是开启状态(AcceptPathInfo On),当你请求http://example.com/img/800/600/imagename.jpg时,Apache会把整个/img/800/600/imagename.jpg当作路径信息传递给CodeIgniter,你的路由规则img/(:num)/(:num)/(:any)就能正确捕获到文件名参数。

而Ubuntu默认的Apache配置中,AcceptPathInfo是关闭的(AcceptPathInfo Off)。这时Apache会把imagename.jpg当成一个实际存在的文件去查找,找不到就直接返回404,根本不会把请求转发给CodeIgniter处理。当你在URL末尾加斜杠时,Apache会把imagename.jpg/后面的空内容识别为路径信息,反而会把前面的部分传递给CodeIgniter,所以路由能正常匹配。

解决办法

方法1:修改Apache配置开启AcceptPathInfo

这是最直接的解决方案:

  • 如果你有权限修改虚拟主机配置,找到对应站点的<VirtualHost>块,添加:
    AcceptPathInfo On
    
    然后重启Apache服务:sudo systemctl restart apache2
  • 如果只能通过.htaccess配置(确保Apache允许.htaccess覆盖全局设置),在项目根目录的.htaccess文件中添加:
    AcceptPathInfo On
    

方法2:调整CodeIgniter的URI解析配置

打开application/config/config.php,修改uri_protocol设置,尝试切换为以下值之一:

$config['uri_protocol'] = 'REQUEST_URI';
// 或者
$config['uri_protocol'] = 'PATH_INFO';

这个设置能让CodeIgniter更准确地解析包含特殊字符(比如句点)的URI。

方法3:优化路由规则(可选)

虽然不是核心问题,但可以把路由规则写得更精确,避免意外匹配:

$route['img/(:num)/(:num)/([a-zA-Z0-9_\-\.]+)'] = "image/dynamicresize/$1/$2/$3";

这里用正则表达式明确匹配包含句点的文件名,比(:any)更严谨。

内容的提问来源于stack exchange,提问作者steppenwolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:01:56