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>块,添加:
然后重启Apache服务:AcceptPathInfo Onsudo 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

