Php 使用重写引擎时正确编码url

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']作为搜索关键字 我找

我正在使用一个mod_重写和一个从Akelos框架中提取的路由系统

在搜索键参数中使用一些符号时,我遇到了一个非常大的问题

路由图如下所示:

$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种解决方案的优点和问题,但在这里复制这么多材料是不合适的

  • 在Apache中打开“allowencodedslass”指令
  • url编码后,将%2F替换为%252F,将%5C替换为%255C
  • 双URL编码()
  • 使用未编码的斜杠
  • 将斜杠替换为下划线(\ux)
  • 此外,您的测试代码中有一个错误,位于:

    $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 />
    ");