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我不相信的修复方法.
给出的错误是:
“请求的URL/站点/en/search/”
你的问题中没有提到额外的单词“site”,这使得解释起来很困难,但错误似乎来自 Apache 而不是PHP。
该错误表明 URL 与您的 htaccess 规则不匹配。所以你不需要查看任何 PHP 代码来找出错误,错误就在 Apache 的某个地方。
进一步搜索- 这是因为 URL 无效。查询字符串中允许使用 %2f,但路径中不允许使用 %2f。因为它无效,所以服务器在它达到重写规则之前拒绝它。
www.jampmark.com 的链接提供了 5 个解决方案的优点以及每个解决方案的问题,但将这么多材料复制到此处是不合适的。
另外,您的测试代码中存在错误:
$string[2] = "t\ /#%&=";
Run Code Online (Sandbox Code Playgroud)
斜杠空格不是有效的转义序列。您应该将代码更改为“t\\ /#%&=”; 以避免反斜杠被解释为转义字符。