Zend Framework设置htaccess文件

时间:2012-08-31 16:30:45

标签: apache .htaccess zend-framework

我多年来一直在使用Zend Framework,但已经意识到我们正在修复的错误处理方面的一些关键问题。 (我在这里发布了一个不同的问题:Why my site is always using the ErrorController for all types of errors irrespective of HTTP Status code?解释那里的故事。)

我的问题很快。 Zend Framework的常见.htaccess文件是什么样的?

根据latest ZF documentation

SetEnv APPLICATION_ENV development

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

然而,以上对我来说是新的 - 有人可以解释一下它究竟做了什么吗? 我当前的.htaccess文件有很多301重定向代码,但就本文而言,我只会在此处粘贴相关信息:

ErrorDocument 404 http://www.mydomain.com/pagenotfound/
ErrorDocument 503 http://www.mydomain.com/service-unavailable/

RewriteCond %{REQUEST_URI} !^/liveagent
RewriteCond %{REQUEST_URI} !^/blog
RewriteRule !\.(js|ico|gif|GIF|jpg|JPG|jpeg|png|PNG|pdf|css|html|xml|swf|php|mp3|mp4|webm|ogv|f4v|flv|txt|wsdl|css3|ttf|eot|svg|woff)$ index.php

以上对我们来说工作正常,并且基本上不允许使用Zend运行“liveagent”和“blog”(Wordpress)目录,但我意识到我现在需要进行以下更改:

必须从代码中删除ErrorDocument 404,因为Zend Framework应该处理所有错误。但是,当我删除它时,转到像www.mydomain.com/this-does-not-exist.php这样的URL会导致404错误标准Apache页面 - 它不会加载ZF或ErrorController。这是因为上面的RewriteRule中的“php”排除。我不只是想删除它,因为我们有时希望能够访问根目录上的php文件,例如我们用于将网站置于维护模式的单独“holding.php”文件。

标准做法是什么?我应该删除php扩展吗?然而,这不会解决其他404的问题 www.mydomain.com/this-does-not-exist.css 这也是上述RewriteRule中的排除(即CSS)。

因此,如上所述,我是否应该完全将上述内容改为Zend的.htaccess新代码?

如果是这样,我是htaccess的初学者 - 如何修改.htaccess代码以允许CSS,JS,视频文件等以及博客和liveagent目录从Zend Framework中排除?

1 个答案:

答案 0 :(得分:2)

我将切换到标准的ZF重写规则,而不是使用长regex重定向到index.php的规则。

以下是标准.htaccess规则的解释:

RewriteCond %{REQUEST_FILENAME} -s [OR] # The request is a regular file with size > 0
RewriteCond %{REQUEST_FILENAME} -l [OR] # The request is to a file that is a symlink
RewriteCond %{REQUEST_FILENAME} -d [OR] # The request is to a directory that exists

# if any of the above conditions are true, then simply handle the request as-is
RewriteRule ^.*$ - [NC,L]

# if none of the above match, then rewrite to index.php
RewriteRule ^.*$ index.php [NC,L]

这些默认的ZF规则不会阻止您访问现有的php文件或可从文档根目录访问的任何其他文件。 如果请求的文件存在,则按原样提供该文件的请求。 如果请求的文件不存在,则请求将转发到index.php

请求转发到ZF后,如果没有匹配的路由,则调用ZF ErrorHandler并提供404页面(来自ZF)。

使用库存ZF规则不会阻止您在应用程序和服务器设置中获得所需的行为,并且应该比您当前拥有的正则表达式更有效。唯一真正改变的事情是,现在对不存在的文件的请求将由ZF的错误处理程序处理,而不再由Apache处理。

希望能回答你的问题,如果没有随意评论澄清。