(这可能属于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
答案 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中正在发生的事情。