正斜杠是中断 URL

关于系统

在我的项目中有这种格式的 URL:-

http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0

其中,关键字/类对意味着使用“ class”关键字进行搜索。

我有一个通用的 index.php 文件,用于执行项目中的每个模块。只有一个重写规则可以从 URL:-中删除 index.php

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

我在准备搜索 URL 时使用 urlencode () ,在读取搜索 URL 时使用 urldecode ()。

问题

只有正斜杠字符正在中断 URL,导致404页未找到错误。 例如,如果我搜索 one/two,URL 是

http://project_name/browse_by_exam/type/tutor_search/keyword/one%2Ftwo/new_search/1/search_exam/0/search_subject/0/page_sort/

我该怎么补救?我需要将 index.php 隐藏在 URL 中。否则,如果不需要的话,正斜杠就没有问题了,我可以使用这个 URL:-

http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one
%2Ftwo/new_search/1/search_exam/0/search_subject/0
134574 次浏览

出于安全原因,Apache 拒绝在路径部分使用 %2F的所有 URL: 脚本通常不能(即。不需要重写)告诉你 %2F/之间的区别,因为 PATH_INFO的环境变量是自动 URL 解码的(这很愚蠢,但是这是 CGI 规范的一个长期部分,所以对此无能为力)。

您可以使用 AllowEncodedSlashes指令关闭这个特性,但是请注意其他 Web 服务器仍然不允许它(没有选择关闭它) ,并且其他字符也可能是禁忌(例如,。特别是 %00将总是被 Apache 和 IIS 阻塞。因此,如果应用程序依赖于路径部分中包含 %2F或其他字符,那么就会限制兼容性/部署选项。

我在准备搜索 URL 时使用 urlencode ()

您应该使用 rawurlencode()而不是 urlencode()来转义路径部分。urlencode()的名称不对,它实际上是用于 application/x-www-form-urlencoded数据,例如查询字符串或 POST 请求的主体,而不是 URL 的其他部分。

区别在于 +并不意味着路径部分的空间。rawurlencode()将正确地生成 %20,它将在表单编码的数据和 URL 的其他部分中工作。

在 Apache 中,AllowEncodedSlash On 将使用404阻止请求立即被拒绝。

只是另一个解决问题的办法。

在我的托管帐户上,这个问题是由所有帐户自动设置的 ModSecurity 规则引起的。当我报告这个问题,他们的管理员迅速删除这个规则为我的帐户。

你可以这样使用 %2F:
?param1=value1&param2=value%2Fvalue

但是如果使用 /param1=value1/param2=value%2Fvalue,它将抛出一个错误。

$encoded_url = str_replace('%2F', '/', urlencode($url));

这个问题的一个标准解决方案是允许使用斜杠,方法是在 url 中使用可能包含斜杠的参数作为最后一个参数。

对于一个产品代码网址,您将有..。

mysite.com/product/details/PR12345/22

搜索关键词

http://project/search_exam/0/search_subject/0/keyword/Psychology/Management

(这里的关键词是心理学/管理学)

处理第一个“命名”参数,然后将其余的参数连接为产品代码或关键字,这并不是一项繁重的工作。

有些框架在其路由定义中内置了此功能。

这不适用于涉及我包含斜杠的两个参数的用例。

将 URL 编码后的% 2F 替换为% 252F

PHP

function custom_http_build_query($query=array()){


return str_replace('%2F','%252F', http_build_query($query));
}

通过 htaccess 处理请求

. htaccess

RewriteCond %{REQUEST_URI} ^(.*?)(%252F)(.*?)$ [NC]
RewriteRule . %1/%3 [R=301,L,NE]

资源

Http://www.leakon.com/archives/865

我使用 javascript encodeURI ()函数来处理 URL 部分,该部分的斜杠应该被看作是字符而不是 http 地址。 例如:

"/api/activites/" + encodeURI("?categorie=assemblage&nom=Manipulation/Finition")

http://www.w3schools.com/tags/ref_urlencode.asp

使用不同的字符并替换斜杠服务器端

例如,Drupal.org 使用% 21(这是一个用来表示惊叹号的字符!)来表示 url 参数中的斜杠。

以下两个连结均有效:

Https://api.drupal.org/api/drupal/includes%21common.inc/7

Https://api.drupal.org/api/drupal/includes!common.inc/7

如果您担心字符可能与参数中的字符冲突,那么可以使用字符组合。

所以你的网址应该是 Http://project_name/browse_by_exam/type/tutor_search/keyword/one_-!two/new_search/1/search_exam/0/search_subject/0

用 js 将其改为斜杠服务器端。

我在 url get param 中遇到了同样的问题,在我的例子中,下面的 php 代码可以工作:

$value = "hello/world"
$value = str_replace('/', '/', $value;?>
$value = urlencode($value);?>
# $value is now hello%26%2347%3Bworld

我首先用 html 实体替换斜杠,然后进行 url 编码。

我通过使用如下两个自定义函数解决了这个问题:

function slash_replace($query){


return str_replace('/','_', $query);
}


function slash_unreplace($query){


return str_replace('_','/', $query);
}

所以为了编码,我可以称之为:

rawurlencode(slash_replace($param))

为了解码,我可以打电话

slash_unreplace(rawurldecode($param);

干杯!

对我来说使用 base64 _ encode 很简单

$term = base64_encode($term)
$url = $youurl.'?term='.$term

在你解码这个术语之后

$term = base64_decode($['GET']['term'])

这样编码“/”和“”

以下是我的拙见。!!!!不要!更改服务器上的设置以使参数正常工作。这是一个定时炸弹,随时可能发生在你更换服务器的某一天。

我发现的最好的方法就是将参数转换为以64为基数的编码。所以在我的例子中,我从 Angular 调用一个 php 服务并传递一个可以包含任何值的参数。

我在客户端中的打印代码如下所示:

    private encodeParameter(parm:string){
if (!parm){
return null;
}
return btoa(parm);
}

并检索 php 中的参数:

    $item_name = $request->getAttribute('item_name');
$item_name = base64_decode($item_name);