Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend框架:Apache解码编码URL而不是传递编码URL?_Php_Apache_Zend Framework - Fatal编程技术网

Php Zend框架:Apache解码编码URL而不是传递编码URL?

Php 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); 但当我

我正在使用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打开编码的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不应该搞砸这件事。这肯定是可以配置的吗?