Php 使用重写引擎时正确编码url
我正在使用一个mod_重写和一个从Akelos框架中提取的路由系统 在搜索键参数中使用一些符号时,我遇到了一个非常大的问题 路由图如下所示:Php 使用重写引擎时正确编码url,php,mod-rewrite,url-rewriting,url-routing,Php,Mod Rewrite,Url Rewriting,Url Routing,我正在使用一个mod_重写和一个从Akelos框架中提取的路由系统 在搜索键参数中使用一些符号时,我遇到了一个非常大的问题 路由图如下所示: $map->connect(":lang/search/:string", array('controller' => 'search','action' => 'index')); 在controller now中,我获得$this->registry->map['params']['get']['string']作为搜索关键字 我找
$map->connect(":lang/search/:string", array('controller' => 'search','action' => 'index'));
在controller now中,我获得$this->registry->map['params']['get']['string']
作为搜索关键字
我找不到正确编码url的方法。例如,让我们使用一个字符串<代码> t/y%%&=<代码> < /p>
urlencode()
给出t%5C++%2F%23%25%26%3D
,页面显示在该服务器上找不到请求的URL/site/en/search/t\+/\\%&=。
rawurlencode()
给出t%5C%20%2F%23%25%26%3D
页面显示相同内容
您可以下载或查看路由器类源代码
我真的不想使用base64作为url和这样的编码,通过它们您无法读取任何内容
如果您需要,这里还有一个.htaccess
文件内容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
重新启动发动机
重写cond%{REQUEST_FILENAME}-D
重写cond%{REQUEST_FILENAME}-F
重写规则^(.*)$index.php?url=$1[QSA,L]
更新
如果有时间,请下载这些文件并在服务器上测试
指南:
controllerclass.php
-简单的控制器框架,通过在其中定义一个类“controller”,使searchcontroller.php能够工作
routerclass.php
-从Akelos框架中提取的路由器类,可能存在bug
routes.php
-定义路线的地方,在我们的例子中,我们只有/search/:string
searchcontroller.php
-测试字符串的基本应用程序-/search/string此处指向此文件
index.php
-所有启动和路由都从这里开始
.htaccess
-我认为这里没有错误
我认为您不需要在index.php
,controllerclass.php
,routes.php
,searchcontroller.php
可能是routerclass.php
中有一个bug,或者.htaccess
中需要一些修复,我不相信。给出的错误是:
“请求的URL/站点/en/search/”
你有一个额外的单词“site”,这在你的问题中没有提到,这使得interpet很难,但是错误似乎来自Apache而不是PHP
错误表明URL与您的htaccess规则不匹配。因此,您不需要查看任何PHP代码来找出错误,错误在Apache中的某个地方
-这是因为URL无效。%查询字符串中允许2f,但路径中不允许2f。因为它是无效的,所以服务器会在它达到重写规则之前拒绝它
到www.jampmark.com的链接给出了5种解决方案的优点和问题,但在这里复制这么多材料是不合适的
$string[2] = "t\ /#%&=";
斜杠空格不是有效的转义序列。您应该将代码更改为“t\\/#%&=”;以避免反斜杠被解释为转义字符。问题似乎与
urlencode
和urldecode
有关。我在以下位置稍微修改了函数:
注意添加了%5C
=>\
和htmlspecialchars()
(htmlspecialchars是关于安全性的,而不是能够使用特殊字符。输入可能是..
或..
等)
因此,您将像这样使用它:
print("<b><i>URL Encode Tests</i></b><br /><br />
<b>Works:</b> ".myUrlEncode($string[0])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[0])."\">/search/".myUrlEncode($string[0])."</a><br />
<b>Does not work:</b> ".myUrlEncode($string[1])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[1])."\">/search/".myUrlEncode($string[1])."</a><br />
<b>Does not work:</b> ".myUrlEncode($string[2])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[2])."\">/search/".myUrlEncode($string[2])."</a><br />
");
print(“URL编码测试
作品:“.myUrlEncode($string[0])”
不起作用:“.myUrlEncode($string[1])”
不起作用:“.myUrlEncode($string[2])”
");
执行此操作后,搜索字符串#3(
\/\\\%&=
)会给出一个PHP错误,如“第30行的…\index.PHP中的方法SearchController::t无效”。我想这是关于路由器中的正则表达式的,所以您可能需要在那里做一些调整。尝试添加B
和NE
标志,每一个单独或组合。同样,没有给出结果。我第二次只添加了B标志,因此[QSA,L,B]
不,不幸的是,它不起作用。你试过了吗?我试着发布一些工作文件供你们检查。不管怎样,我实际上收集了这些文件并将它们放在一起,以便在实际应用程序之外进行测试。而:lang/search/:string
是我在real网站上的案例,它与文件无关。是的,我以前读过这方面的文章,但没有帮助。我不想用下划线代替斜杠。我可以让我的应用程序不需要修改就可以工作,但是URL更难看。我认为routerclass.php中存在错误,因为我可以使用当前的apache配置编写应用程序,使斜杠和url中的数字符号(#)等其他字符完美地工作。谢谢。你能显示那些你认为有用的带有斜杠的URL吗?在您的示例中,是一个使用斜杠的人失败了——这与预期的完全一样,因为Apache不喜欢斜杠。看,除了routerclass.php行为之外,我上传的文件中的所有内容都可以正常工作,因为这个文件将斜杠作为不同控制器、操作和参数的分隔符。例如,像这样搜索“1/2”
:http://^^^/search/(string1/string2)
。那么,您能否显示正在工作的http://^^^/search/(string1/string2)的URL编码版本,以便我们能够找出Apache接受的原因?请注意,一切都可以正常使用常规urlenco
print("<b><i>URL Encode Tests</i></b><br /><br />
<b>Works:</b> ".myUrlEncode($string[0])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[0])."\">/search/".myUrlEncode($string[0])."</a><br />
<b>Does not work:</b> ".myUrlEncode($string[1])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[1])."\">/search/".myUrlEncode($string[1])."</a><br />
<b>Does not work:</b> ".myUrlEncode($string[2])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[2])."\">/search/".myUrlEncode($string[2])."</a><br />
");