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中的冲突视图助手名称

Zend Framework 项目 index.php 的问题

Zend Framework:从路由获取子域参数

如何使 Zend Framework 2 与 nginx 一起工作?