在codeigniter网站上无法读取图片?

时间:2011-02-20 22:36:38

标签: .htaccess codeigniter apache2

(这可能属于serverfault,因为apache导致错误;请在必要时移动。)

我有一个CodeIgniter网站,我正在尝试显示图像。我的图像存储在ignite / application / images文件夹中(其中ignite实际上是CodeIgniter的root安装),这是我的代码:

 <td><img src="<?php echo base_url(); ?>application/images/unrav.png" /></td>

渲染的源生成以下URL:

<td><img src="http://localhost/ignite/application/images/unrav.png" /></td> 

这应该工作,但它不显示图像,当我直接转到URL时,我收到以下错误:

Access forbidden!

You don't have permission to access the requested object. It is either read-protected or not readable by the server.

If you think this is a server error, please contact the webmaster.

Error 403

localhost
Sun 20 Feb 2011 04:31:02 PM CST
Apache/2.2.14 (Unix) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1

我已经检查了图像权限并将它们设置为777(读取,写入,执行所有者,组和公共)。这是在我的本地开发服务器上,如果我在浏览器中进行文件/打开并在文件系统中导航到图像,它会正确显示,所以我知道图像没有损坏或任何东西。谁能让我知道发生了什么?到目前为止,我已经严格完成了开发,没有服务器管理员,所以我完全不熟悉apache的问题。

已编辑以添加apache错误日志:

[Sun Feb 20 16:26:07 2011] [error] [client 127.0.0.1] client denied by server configuration: /opt/lampp/htdocs/ignite/application/images/unrav.png

再次编辑添加.htaccess:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt|css)
aRewriteRule ^(.*)$ /index.php/$1 [L]

再次编辑,在添加RewriteBase后添加apache日志:

[Sun Feb 20 17:02:19 2011] [notice] suEXEC mechanism enabled (wrapper: /opt/lampp/bin/suexec)
[Sun Feb 20 17:02:19 2011] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Sun Feb 20 17:02:19 2011] [warn] RSA server certificate CommonName (CN) `localhost' does NOT match server name!?
[Sun Feb 20 17:02:19 2011] [notice] Digest: generating secret for digest authentication ...
[Sun Feb 20 17:02:19 2011] [notice] Digest: done
[Sun Feb 20 17:02:20 2011] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Sun Feb 20 17:02:20 2011] [warn] RSA server certificate CommonName (CN) `localhost' does NOT match server name!?
[Sun Feb 20 17:02:20 2011] [notice] Apache/2.2.14 (Unix) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations

1 个答案:

答案 0 :(得分:4)

我的猜测是你的.htaccess文件未正确设置为重写图像文件请求。当您从服务器根目录以外的其他位置(即/ignite/)提供CodeIgniter时,标准CI .htaccess文件可能与images文件夹不匹配,以便不将其重写为指向index.php。

.htaccess文件中有什么内容?是否有RewriteBase指令?请参阅the mod_rewrite wiki CI entry,了解您是否可以获得任何线索。或者只是尝试

RewriteBase /ignite/ 

...在RewriteEngine On之后,看看会发生什么。

如果它有助于了解正在发生的事情,标准CI .htaccess看起来像这样:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|table-images|js|robots\.txt|css)
RewriteRule ^(.*)$ /index.php/$1 [L]

主要事件是RewriteRule,它会抛出所有进入index.php末尾的内容。这样您就不需要在CI网址的开头index.php,而是http://www.example.com/index.php/controller/method,而不是http://www.example.com/controller/method,您只需撰写^(.*)$

通过从路径(^(.*)$)获取所有内容并在index.php的末尾重写它。模式$1中的括号是一个组。每个组都会得到一个数字,您可以使用$ n在其他地方“反引用”它。在这种情况下,只有一个组,您可以在其他地方将其称为RewriteRule ^(.*)$ /index.php/$1 [L] 。所以:

RewriteCond

表示“从路径的开头(^)到结尾($)抓取所有内容(。*),并将其称为$ 1(因为它是括号中的第一个表达式)。然后将路径重写为/index.php / $ 1“,即在index.php的末尾推送所有内容。

现在,这对大多数事情都很好 - 所有控制器和方法 - 但是如果你有一些想要提供的静态文件,比如图像,你想要去通过你的控制器,即你的index.php。只需要在没有通过PHP的情况下提供服务就可以快得多。

这就是RewriteCond $1 !^(index\.php|images|table-images|js|robots\.txt|css) 进来的地方。在这种情况下:

$1

...我们所说的是“,如果其模式中的第一个组(再次,!({{1},则只运行以下RewriteRule })begin(^)包含以下列表:“index.php”,“images”,“table-images”,“js”,“robots.txt”或“css”。

这就是图像的提供方式 - 而不是由RewriteRule重写的URL,就像调用控制器一样,就像通过index.php一样,它们被忽略了,因为RewriteCond有效地说“不要重写任何以”图像“开头的路径,然后正常地为Apache提供服务。

希望这可以帮助您掌握.htaccess中正在发生的事情。