httpd.conf如下:
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks MultiViews
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
注意:
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Mac自带的apache的httpd.conf配置中是有上面的配置。这时我就怀疑了/不是代表所有目录吗?于是我把其中的None改为All,把下面的配置为:AllowOverride None。重启apache服务。结果还是报错。我观察到的配置在之前,又怀疑是不是apache顺序读取。将两者顺序颠倒,满怀希望这样就正常了,结果……哎,又报错。无语了,最终还是把我项目目录下面的None改为All。如果谁详细研究过,帮忙讲解一下,感谢万分……
关于引导文件,有这么说的: Zend Framework控制器类 Zend_Controller支持网站使用“干净的URL”5。为此所有的请求都需要通过index.php进入。这就是通常所说的前端控制器(Front Controller)设计模式。它为我们的应用程序的所有页面提供了一个中心控制点并确保程序的运行环境已经正确设置。要完成这一切,都必须在【项目名称】/public目录下创建一个.htaccess文件: 【项目名称】/public/.htaccess # Zend Framework rewrite规则 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* index.php # 安全性考虑:不允许列表目录内容 Options -Indexes # PHP设置 php_flag magic_quotes_gpc off php_flag register_globals off php_flag short_open_tag on RewriteRule非常简单,可理解为“对所有不能映射到磁盘上已存在的文件的url,都用index.php来代替”。 为了安全起见,我们设定了一些PHP的ini设置;我们还将 short_open_tag 选项设置为on,因为将来视图文件可能会用到它。当然这些设置可能已经正确设置过了,但我们必须确保这一点。注意只有在使用PHP模块(mod_php)的方式下才可以在.htaccess文件中使用php_flag标记。如果使用CGI/FastCGI模式,必须保证在php.ini中正确设置了这些参数。注意,为了让.htaccess起作用,必须在httpd.conf中将配置指令AllowOverride设置为All. 摘自此书《Zend-Framework入门指南》 。
咱还是言归正传,研究咱的None改All问题,之前也看到过将None改为All,必须保证Apache已配置成支持.htaccess文件的模式。这样才能通过修改.htaccess文件中的RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php中的index.php来修改引导文件。其中前端控制器在这里面配置。所有的请求都经过前端控制器(前端控制器使用了一个路由类将请求的URL映射到相应的显示页面内容的PHP函数。路由类要正常工作,必须知道该URL中哪些部分用于映射到index.php的路径,这样它才可以从其后余下的部分中读取URI元素。这个工作由Request对象来完成。Request对象可以有很强的自动检测正确的基地址(base URL)的能力,但如果它在你的设置环境中不能正常工作,可以使用$frontController->setBaseUrl()来覆盖它。)转发,昨天新建了一个项目,修改None为All,结果没什么变化。就在刚刚,才明白,原来根本我没有请求别的控制器,所以没有什么影响。如果你写了多个控制器,就可以看到以上的错误。记住:所有的请求都是经过前端控制器的,经过路由转发到各个控制器下面。若你没有让apache支持.htaccess文件的模式(即将AllowOverride None改为AllowOverride All),请求就找不到前端控制器,没法进行请求的转发,以导致错误的出现:The requested URL /article/show/id/e3cf1138-b12a-11e1-a625-18d8f1322421 was not found on this server.我将AllowOverride All就ok了,兴奋ing……
5、-sh: zf: command not found
ln -s /var/root/Downloads/php/ZendFramework-1.12.0/bin/zf.sh /usr/bin/zf (创建软链,记得linux是编辑/etc/profile,例如:vi /etc/profile #把mysql服务加入系统环境变量:在最后添加下面这一行
export PATH=$PATH:/usr/local/mysql/bin 使用./etc/profile使其生效)
其中,/var/root/Downloads/php/ZendFramework-1.12.0为我下载的框架的目录路径
6、配好apache后启动项目(此为win下面的):报错: you don’t have permission to access / on this server
解决方案:
其中默认为:
DirectoryIndex index.html
修改为
DirectoryIndex index.html index.html.var index.htm index.shtml index.jsp index.php index.phtml
7、当你在地址栏直接输入地址,访问你的某个页面的时候,例如:http://localhost/templates/site/index.phtml,它会之间将你的页面源码显示出来,令人郁闷的问题……解决方案:在httpd.conf最后加入如下代码:
AddType application/x-httpd-php .php
AddType application/x-httpd-php .html
AddType application/x-httpd-php .htm
AddType application/x-httpd-php .phtml
实质就是添加可以执行php的文件类型。这同时也设计到了http请求的问题,等有时间再给大家详细分析,目前就先到这里……
8、一个令人着实恶心的问题,用zf+smarty的时候,查询总是乱码。这个郁闷死我了,页面设置了utf-8的编码,php文件设置了utf-8的编码,数据库中也是设置了utf8的编码,但是为什么还是乱码呢?为什么?为什么?
研究了半天,原来是zf配置adapter的时候,也要将adapter的编码设置为utf8:代码如下:
$dbAdapter->query ( 'SET names utf8' );
nnd,这个真是恶心,我今天没有设置这个,查询条件用了中文,死活没有输出,以为代码错了呢。后来用了英文,结果ok……郁闷。最终考虑是编码的问题,导致进库查询的时候就是乱码,以无匹配项告终。。。哎,这个就先到这里吧!大家要是用zf,要注意四处编码的设置哦!不要像我这样郁闷半天……