Zend Framework - 当 URL 在控制器/动作段上有 $$$ 或 ~ 时出错
Posted
技术标签:
【中文标题】Zend Framework - 当 URL 在控制器/动作段上有 $$$ 或 ~ 时出错【英文标题】:Zend Framework - Error when URL has $$$ or ~ on controller/action segment 【发布时间】:2011-06-10 03:38:28 【问题描述】:在我们基于 ZF 的站点中,如果 url 在控制器/动作段上包含 $$$
或 ~
,则不会被捕获为 404 错误,相反,它们会在没有符号的情况下登陆控制器/动作,但是当它尝试加载视图脚本,但视图脚本文件仍然有这些符号,从而导致错误。
例如:
site.com/index$$$
script 'index$$$/index.phtml' not found in path
site.com/index-$$$
script 'index-$$$/index.phtml' not found in path
site.com/index~
script 'index~/index.phtml' not found in path
site.com/index/index~
script 'index/index~.phtml' not found in path
它们必须被捕获为 404 错误,如果控制器/操作不存在,则外站可以捕获 404 错误。
ex: /badurl$$$, /non/existing~
例子:http://framework.zend.com/index.$$$/index~
是否有任何现有问题/解决方案?
提前致谢!
PS:我们仍在使用 ZF 1.0.3,但这也会影响 1.8.2 中的其他网站。
更新:这是.htaccess的内容
RewriteEngine on
RewriteBase /
RewriteCond %REQUEST_URI ^/search$
RewriteCond %QUERY_STRING ^(.*)$
RewriteRule . /search/?%1 [R=301,L]
# Redirect all https urls to http
# These are the pages excluded on the redirection
RewriteCond %SERVER_PORT ^443$
RewriteCond %REQUEST_URI !^/minify/.*
RewriteCond %REQUEST_URI !^/myaccount/.*
RewriteCond %REQUEST_URI !^/akamai/.*
RewriteCond %REQUEST_URI !^/navigation/.*
RewriteCond %REQUEST_URI !^/cache/.*
RewriteCond %REQUEST_URI !^/includes/.*
RewriteCond %REQUEST_URI !^/images/.*
RewriteCond %REQUEST_URI !^/pdf/.*
RewriteCond %REQUEST_URI !^/index.php
RewriteRule ^(.*)$ http://%HTTP_HOST/$1 [R=301,L]
######################################################
# if non-PHP file is requested, display the file #
RewriteRule \.(js|ico|txt|gif|jpg|png|css|xml|swf|zip|pdf|gz)$ - [L,NC]
# if PHP file is requested and it exists, display the file #
RewriteCond %REQUEST_FILENAME -f
RewriteRule \.php$ - [L]
# redirect everything else to controller #
RewriteCond %REQUEST_URI !^/server-status.*
RewriteRule .+$ index.php [L]
# Disable Etags
FileETag none
【问题讨论】:
你的重写规则是什么?采埃孚 1.0.3?该死的。 更新帖子以包含重写规则。 我重新阅读了您的帖子。如果控制器被正确调用,但视图脚本不是,听起来你的 PHP 实际上是错误的。你如何设置视图脚本路径? 【参考方案1】:问题不在您的 .htaccess 文件中。
您的问题源于调度程序,请参阅 1.0.3 Zend_Controller_Dispatcher_Abstract::_formatName()
中的受保护方法。自 1.0.3 以来,此方法也没有改变。因此,升级将无济于事。
它实际上是使用 preg_replace('/[^a-z0-9 ]/', '', $segment)
从 URI 中删除所有特殊字符并返回一个有效的类名。
如果不编写自己的自定义调度程序,您将不得不使用带有字母数字字符的不同命名,即 /xxx 或 /000
参见下面的方法:
/**
* Formats a string from a URI into a PHP-friendly name.
*
* By default, replaces words separated by the word separator character(s)
* with camelCaps. If $isAction is false, it also preserves replaces words
* separated by the path separation character with an underscore, making
* the following word Title cased. All non-alphanumeric characters are
* removed.
*
* @param string $unformatted
* @param boolean $isAction Defaults to false
* @return string
*/
protected function _formatName($unformatted, $isAction = false)
// preserve directories
if (!$isAction)
$segments = explode($this->getPathDelimiter(), $unformatted);
else
$segments = (array) $unformatted;
foreach ($segments as $key => $segment)
$segment = str_replace($this->getWordDelimiter(), ' ', strtolower($segment));
$segment = preg_replace('/[^a-z0-9 ]/', '', $segment);
$segments[$key] = str_replace(' ', '', ucwords($segment));
return implode('_', $segments);
【讨论】:
感谢您的出色发现。将尝试查看是否可以为此修补我们的代码。 我只是放了一些像这样的重定向规则会保存吗? 80 # 由于 ZF 奇怪的名称格式,不允许奇怪的 url 片段导致应用程序出现 500 错误 81 RewriteRule ^.+[^-a-zA-Z0-9_/]$ /404.html [R=301,L] 82 RewriteRule ^ .+[^-a-zA-Z0-9_]/.+$ /404.html [R=301,L] 我认为您使用重写规则捕获无效请求的想法很好。请注意其他文件名,如图像、js、css 等。以上是关于Zend Framework - 当 URL 在控制器/动作段上有 $$$ 或 ~ 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Zend Framework 中生成用于重置密码的随机密码或临时 URL?
Zend Framework 2 中的路由,跳过 url 中的“索引”操作但获取 id
php - Zend Framework中的冲突视图助手名称