使用重写引擎时正确编码URL

Dav*_*vit 6 php mod-rewrite url-rewriting url-routing

我正在使用从Akelos Framework中提取的mod_rewrite和路由系统.

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

路由映射如下:

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

在控制器中,我现在得到$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>
Run Code Online (Sandbox Code Playgroud)

更新

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

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

指南:

controllerclass.php - 简单的控制器框架,通过在其中定义类"Controller"来使searchcontroller.php工作

routerclass.php - 从Akelos Framework中提取的路由器类,可能存在bug

routes.php - 您定义路线的地方,在我们的情况下,我们只有 /search/:string

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

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

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

我想你不会需要在变化index.php,controllerclass.php,routes.php,searchcontroller.php

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

Dan*_*ack 1

给出的错误是:

“请求的URL/站点/en/search/”

你的问题中没有提到额外的单词“site”,这使得解释起来很困难,但错误似乎来自 Apache 而不是PHP。

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

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

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

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

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

$string[2] = "t\ /#%&=";
Run Code Online (Sandbox Code Playgroud)

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