我正在使用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路由请求的方式可能存在问题。你认为情况可能如此吗?
答案 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函数调用,但保留变量并重新测试代码。