1

我已经使用 Zend 框架多年,但已经意识到我们现在正在修复的错误处理的一些关键问题。(我在这里发布了一个不同的问题:为什么我的网站总是使用 ErrorController 来处理所有类型的错误,而不管 HTTP 状态代码如何?在那里解释这个故事)。

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

根据最新的 ZF 文档

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

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

必须从代码中删除 ErrorDocument 404,因为 Zend 框架应该处理所有错误。但是,当我删除它时,转到像 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 框架中排除?

4

1 回答 1

2

我会切换到标准的 ZF 重写规则,而不是使用长正则表达式重定向到 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 处理。

希望这回答了你的问题,如果不能随意评论澄清。

于 2012-08-31T17:59:29.783 回答