gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:26:37 26 4
gpt4 key购买 nike

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

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

路由映射如下:

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

现在在 Controller 中,我将 $this->registry->map['params']['get']['string'] 作为搜索关键字。

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

urlencode() 给出t%5C+%2F%23%25%26%3D 页面显示请求的URL/site/en/search/在此服务器上未找到 t\+/#%&=。

rawurlencode() 给出 t%5C%20%2F%23%25%26%3D 并且页面显示相同。

可以下载或查看路由器类源here on this page

我真的不想将 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>

更新

Here are actually working files for making tests.

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

指南:

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

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

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

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

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

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

我认为您不需要对 index.phpcontrollerclass.phproutes.php 进行更改搜索 Controller .php

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

最佳答案

看起来问题是关于 RFC 3986 Section 7.3 (Back-End Transcoding) 的关于 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 错误,例如“第 30 行的方法 SearchController::t 在 ...\index.php 中无效”。我想这与路由器中的正则表达式有关,因此您可能需要在那里进行一些调整。

关于php - 使用重写引擎时正确编码 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14265470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com