Zend Framework:Apache解码编码的URL而不是传递编码的URL?

时间:2010-10-14 16:50:04

标签: php apache zend-framework

我正在使用Selenium和PHPUnit测试我的Zend Framework应用程序。我有一个需要打开包含编码URL的URL的测试。

$redirectToLocation = urlencode('/myothercontroller/action'); // %2Fmyothercontroller%2Faction
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation);

但是当我运行测试时,浏览器尝试打开已解码的URL:

/controller/action/thenRedirectTo//myothercontroller/action

如何让selenium打开已编码的网址?

更新:实际上......结果是selenium正在做它的工作,但似乎Apache在它到达控制器之前解码了URL:

The requested URL /controller/action/thenRedirectTo//myothercontroller/action was not found on this server.

我该如何解决这个问题?

更新:以下是关于我遇到的同一问题的完整对话:http://old.nabble.com/URL-Encoding-td18850769.html。他们的解决方法是对网址进行base64编码,但这对我来说还不够好。我可以在短期内使用这个解决方案,但我想知道这个问题的真正原因是什么,所以我可以消除它。

更新:我有一位同事认为Zend Framework路由请求的方式可能存在问题。你认为情况可能如此吗?

5 个答案:

答案 0 :(得分:2)

这是一个Apache“功能”。编码的斜杠会自动解码并发送到应用程序(php)。因此,它被认为是一个长uri而不是uri,其中编码的uri作为参数。

尽管如此,可以通过在配置中使用AllowEncodedSlashes On来关闭此功能。有关Apache manual的更多信息。请注意,该指令的上下文是服务器配置和虚拟主机,因此您无法将其放在.htaccess文件中。

答案 1 :(得分:0)

有趣的问题。我个人从未在查询字符串中传递另一个URL时遇到任何问题,即/ controller / action / thenRedirectTo?q =%2Fmyothercontroller%2Faction,但我很长时间没有使用过Apache,而这并不是你的'重新尝试。

一种可能的解决方案是双网址编码。

$redirectToLocation = urlencode(urlencode('/myothercontroller/action'));
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation);

也许Apache只会将其解码为一级。

答案 2 :(得分:0)

之前我遇到过这种行为,正在进行解码的是mod_rewrite。据我所知,绕过它的唯一方法是urlencode请求URL中需要保留两次特殊字符的部分。

答案 3 :(得分:0)

您应该在Apache中以调试模式设置mod_rewrite并查看他的操作:

RewriteEngine on
RewriteLog /tmp/rewrite.log
RewriteLogLevel 9

并向我们展示您的ZF重写规则。它肯定基于%{QUERY_STRING},它是竞争解码的网址。我们可以尝试使用%{THE_REQUEST}重做它,这是未解码的URL。最好的办法是只为正确的控制器处理%{THE_REQUEST}。

另一个解决方案可能是在url上使用base64编码,因此mod_rewrite和任何其他工具永远不会将其作为url信息捕获。

要测试的另一件事是mod_rewrite上的[B],如下所述:How to encode special characters using mod_rewrite & Apache?。但我不知道会不会破坏重写规则。

答案 4 :(得分:0)

看起来Zend Framwork issue与您的问题有关。要验证打开Zend / Controller / Request / Http.php并删除urldecode函数调用,但保留变量并重新测试代码。