urlencoded正斜杠破坏URL

关于系统


我的项目中有这种格式的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} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ 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


繁花如伊
浏览 612回答 3
3回答

扬帆大鱼

%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的其他部分都起作用。

慕无忌1623718

我在url get param中存在斜线相同的问题,在我的情况下,以下php代码有效:$value = "hello/world"$value = str_replace('/', '/', $value;?>$value = urlencode($value);?># $value is now hello%26%2347%3Bworld我先用html实体替换斜杠,然后再进行url编码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java