为了账号安全,请及时绑定邮箱和手机立即绑定

urlencoded正斜杠破坏URL

urlencoded正斜杠破坏URL

繁花如伊 2019-10-09 14:59:50
关于系统我的项目中有这种格式的URL:http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0关键字/类别对表示使用“类别”关键字进行搜索。我有一个通用的index.php文件,该文件针对项目中的每个模块执行。只有重写规则才能从URL中删除index.php:-RewriteCond $1 !^(index\.php|resources|robots\.txt)RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php [L,QSA]我在准备搜索URL时使用urlencode(),在阅读搜索URL时使用urldecode()。问题仅正斜杠字符破坏了URL,导致404页面未找到错误。例如,如果我搜索one/two的网址是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
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

%2F出于安全原因,Apache拒绝在路径部分中使用的所有URL :由于环境变量会自动进行URL解码(这是愚蠢的做法,但长期以来一直存在)%2F,/因此脚本通常无法(即,无需重写)来区别两者之间的区别。PATH_INFOCGI规范的一部分,因此无法执行任何操作)。


您可以使用AllowEncodedSlashes指令关闭此功能,但请注意,其他Web服务器仍将禁止使用此功能(没有选择将其关闭),并且其他字符也可能是忌讳的(例如%5C),%00尤其始终是被Apache和IIS阻止。因此,如果您的应用程序依赖于%2F在路径部分中包含字符或其他字符,则将限制您的兼容性/部署选项。


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


您应该使用rawurlencode(),而不是urlencode()转义路径部分。urlencode()被错误命名,它实际上是用于application/x-www-form-urlencoded查询字符串或POST请求正文中的数据,而不用于URL的其他部分。


区别在于,+这并不意味着路径部分中存在空间。rawurlencode()会正确地产生%20,这将对表单编码的数据和URL的其他部分都起作用。


查看完整回答
反对 回复 2019-10-09
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

我在url get param中存在斜线相同的问题,在我的情况下,以下php代码有效:


$value = "hello/world"

$value = str_replace('/', '/', $value;?>

$value = urlencode($value);?>

# $value is now hello%26%2347%3Bworld

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


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 611 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信