【问题标题】:Zend Framework setting up the htaccess fileZend Framework 设置 htaccess 文件
【发布时间】:2012-08-26 12:05:05
【问题描述】:

多年来我一直在使用 Zend 框架,但已经意识到我们现在正在修复的错误处理的一些关键问题。 (我在这里发布了一个不同的问题: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

以上对我们来说工作正常,基本上不允许“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 框架中排除?

【问题讨论】:

  • 您愿意寻求解决方案吗?你愿意讨论吗?你甚至知道有“cmets”部分吗?通过努力和耐心,我在您提供的链接中写下了您问题的答案,您是否对此有所了解?您是否对我的回答发表了评论并正确地提出了问题?你甚至知道你真正在寻找什么吗?
  • 首先非常感谢您对另一个帖子的彻底回复,我的意思是一旦我实际尝试过就给您回复,对于任何冒犯我深表歉意,因为我需要与另一位同事一起完成它.另一方面,我认为,我的 .htaccess 文件没有在另一篇文章中解决 - 事实上,它导致了一个紧急问题(如上所述),我现在意识到这是一个与我之前的帖子不同的问题,我在回到 ErrorController 之前需要重点关注。因此出现了一个新问题,询问标准 htaccess 是什么样的。希望您能理解,再次感谢。
  • 当然,我明白了...慢慢来:)

标签: apache .htaccess zend-framework


【解决方案1】:

我会切换到标准的 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 处理。

希望这回答了您的问题,如果不能随时发表评论以进行澄清。

【讨论】:

  • 非常感谢这个和整个解释,这很好用。只是一个关于 .htaccess 的一般性问题 - 上面的第二个 RewriteRule(# 如果以上都不匹配,则重写为 index.php) - 基本上只有在上面的一个失败时才会执行?基本上,如果满足上述条件之一,则执行第一个 RewriteRule。然后它停止并且 .htaccess 停止与其他 RewriteRules 一起前进。否则,如果它不执行,则第二个 RewriteRule 完成。对吗?
  • RewriteCond 类似于重写规则的 if 语句。因此,如果前 3 个 RewriteCond 中的任何一个为真,则执行规则 RewriteRule ^.*$ - [NC,L][L] 标志表示“最后一个”,这意味着在该规则之后不应再处理任何规则。因此,如果该文件确实基于 RewriteCond 之一存在,则该请求将作为下一个重写规则来处理,用于将所有内容重写为 index.php 永远不会执行。如果 RewriteCond 都不为真,即请求的文件不存在,则执行 index.php 的第二个重写规则。希望能回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多