6

我正在使用从 Akelos 框架中提取的 mod_rewrite 和路由系统。

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

路由图如下:

$map->connect(":lang/search/:string", array('controller' => 'search','action' => 'index'));

现在在控制器中,我得到$this->registry->map['params']['get']['string']一个搜索关键字。

我找不到正确编码网址的方法。例如让我们取一个字符串t\ /#%&=

urlencode()给出t%5C+%2F%23%25%26%3D和页面显示The requested URL /site/en/search/t\+/#%&= was not found on this server.

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>

更新

这里实际上是用于进行测试的工作文件。

如果您有时间,请下载这些文件并在您的服务器上进行测试。

指导:

controllerclass.php- 简单的控制器框架,通过在其中定义一个“控制器”类使 searchcontroller.php 能够工作

routerclass.php- 从 Akelos 框架中提取的路由器类,可能存在错误

routes.php- 一个你定义你的路线的地方,在我们的例子中,我们只有/search/:string

searchcontroller.php- 测试字符串的基本应用程序 - /search/stringhere 指向此文件

index.php- 所有启动和路由恰好开始的地方

.htaccess- 我认为这里没有错误

我认为您不需要更改index.php, controllerclass.php, routes.php,searchcontroller.php

可能存在错误,routerclass.php或者可能需要一些.htaccess我不相信的修复。

4

2 回答 2

2

看起来问题是关于RFC 3986 第 7.3 节(后端转码)urlencodeurldecode. 我在http://php.net/manual/en/function.urlencode.php#97969稍微修改了函数:

function myUrlEncode($string) {
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%5C', '%3F', '%25', '%23', '%5B', '%5D');
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "\\", "?", "%", "#", "[", "]");
    return htmlspecialchars(str_replace($entities, $replacements, urlencode($string)));
}

请注意添加 %5C=>\htmlspecialchars()(htmlspecialchars 是关于安全性而不是能够使用特殊字符。输入可能是<script>...<h1>...:) )。

所以你会像这样使用它:

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

之后,搜索字符串 #3 ( \ /#%&=) 会给出一个 PHP 错误,例如“Method SearchController::t is invalid in ...\index.php on line 30”。我想这与路由器中的正则表达式有关,因此您可能需要在那里进行一些调整。

于 2013-01-13T15:09:15.280 回答
1

给出的错误是:

"请求的 URL /站点/en/search/"

您的问题中没有提到额外的“站点”一词,这使得难以解释,但错误似乎来自 Apache而不是PHP。

该错误表明您的 htaccess 规则不匹配这些 URL。所以你不需要查看任何 PHP 代码来找出错误,错误在 Apache 的某个地方。

进一步搜索- 这是因为 URL 无效。查询字符串中允许使用 %2f,但路径中不允许使用。因为它是无效的,所以服务器在它达到重写规则之前拒绝它。

www.jampmark.com 的链接提供了 5 个解决方案的优点和每个解决方案的问题,但将这么多材料复制到此处是不合适的。

  1. 在 Apache 中打开“AllowEncodedSlashes”指令
  2. 在 url 编码后将 %2F 替换为 %252F 并将 %5C 替换为 %255C
  3. 双 urlencode()
  4. 使用未编码的斜杠
  5. 用下划线 (_) 替换斜杠

此外,您的测试代码中存在错误:

$string[2] = "t\ /#%&=";

斜杠空格不是有效的转义序列。您应该将代码更改为 "t\\ /#%&="; 避免反斜杠被解释为转义字符。

于 2013-01-13T13:26:45.973 回答