Php Zend框架:Apache解码编码URL而不是传递编码URL?
我正在使用Selenium和PHPUnit测试我的Zend Framework应用程序。我有一个测试需要打开一个包含编码URL的URLPhp Zend框架:Apache解码编码URL而不是传递编码URL?,php,apache,zend-framework,Php,Apache,Zend Framework,我正在使用Selenium和PHPUnit测试我的Zend Framework应用程序。我有一个测试需要打开一个包含编码URL的URL $redirectToLocation = urlencode('/myothercontroller/action'); // %2Fmyothercontroller%2Faction $this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation); 但当我
$redirectToLocation = urlencode('/myothercontroller/action'); // %2Fmyothercontroller%2Faction
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation);
但当我运行测试时,浏览器尝试打开解码的URL:
/controller/action/thenRedirectTo//myothercontroller/action
我应该如何让selenium打开编码的URL
更新:实际上……事实上,selenium正在完成它的工作,但似乎Apache在访问控制器之前正在解码URL:
The requested URL /controller/action/thenRedirectTo//myothercontroller/action was not found on this server.
我应该如何解决这个问题
更新:以下是关于我遇到的同一问题的完整对话:。他们的解决方法是对url进行base64编码,但这对我来说还不够好。我可能会在短期内使用这个解决方案,但我想知道这个问题的真正原因是什么,这样我就可以消除它
更新:我的一位同事认为Zend Framework路由请求的方式可能有问题。你认为会是这样吗 有趣的问题。我个人从未遇到过在查询字符串中传递另一个URL的问题,即/controller/action/thenRedirectTo?q=%2fmothercontroller%2Faction,但我已经很长时间没有使用Apache了,这并不是您想要做的 一种可能的解决方案是对其进行双url编码
$redirectToLocation = urlencode(urlencode('/myothercontroller/action'));
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation);
也许Apache只会url对其进行一级解码。我以前遇到过这种行为,解码的是mod_rewrite。据我所知,唯一的解决方法是对请求URL中需要保留两次特殊字符的部分进行URL编码。您应该在Apache中将您的mod_rewrite设置为调试模式,看看他是怎么做的:
RewriteEngine on
RewriteLog /tmp/rewrite.log
RewriteLogLevel 9
并向我们展示您的ZF重写规则。它肯定是基于%{QUERY\u STRING}的,这是完全解码的url。我们可以尝试使用%{THE_REQUEST}重新编写它,这是未解码的url。最好是只为正确的控制器处理%{The_REQUEST}
另一个解决方案是在url上使用base64编码,这样mod_rewrite和任何其他工具都不会将其作为url信息捕获
另一个需要测试的是mod_重写上的[B],如下所述:。但我想知道的是,它不会违反重写规则。看起来这与您的问题有关。要验证,请打开Zend/Controller/Request/Http.php并删除urldecode函数调用,但要保留变量并重新测试代码。这是Apache的一个“功能”。编码的斜杠会自动解码并发送到应用程序(php)。因此,它被识别为一个长uri,而不是以编码uri作为参数的uri
然而,通过在配置中使用
allowencodedslash On
可以关闭此功能。更多信息请访问。请注意,此指令的上下文是服务器配置和虚拟主机,因此您无法将其放置在.htaccess文件中。尚未尝试此操作,但它可能会起作用。然而,我宁愿调整Apache以使其正确工作,也不愿修改我的代码。这是一个丑陋的解决方法。我同意Apache不应该搞砸这件事。这肯定是可以配置的吗?