URL编码冒号(%3A)在403中解析

时间:2014-10-31 10:33:25

标签: apache rest url mod-rewrite colon

我正在Apache服务器(一个典型的xampp包)中托管一些其他API。

当我使用http方法攻击资源时(以put:post,get ...为准)并且URL包含编码冒号%3A,服务器有时会回复403错误。它似乎取决于服务器的文件夹结构。如果存在现有文件夹并且您的网址攻击该文件夹中包含%3A的资源,则服务器返回403.当它不包含%3A时,它会返回404,就像它应该的那样。

有这样的结构:

htdocs/apis/userContext
htdocs/apis/subscriptions

http://localhost/apis/userContext/users/tel%3A2032342349 Works (returns 404 not found, because users doesn't exist)
http://localhost/apis/userContext/tel%3A2032342349 Doesn't work (returns 403)
http://localhost/subscriptions/tel%3A2032342349 Doesn't work (returns 403)
http://localhost/nonexistingfolder/tel%3A2032342349 works (returns 404, becasue nonexistingfolder doesn't exist)

这很烦人,因为网址中出现的很多值都是telURIs,看起来像这样

tel:+34678678678

所以请不要告诉我不要在那里使用冒号,因为这根本不可能。我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:0)

我只能找到一个有关此信息的有效信息(自2006年10月起) - here

显然,这个错误不会出现在Linux上,它发生在Windows平台上。根据消息来源,一个简短的名称,后跟冒号(:)可以解释为一个驱动器名称(为什么这个和为什么file://不表示 - 我不知道)。

我必须解决这个问题,但我可以自己设置链接(不知道你是否有奢侈品)。我的解决方案是:

  • 用首选字符替换URI中的冒号(我选择了下划线) - urlencode($uri) → urlencode(strtr($uri, ":", "_"))
  • 在应用相同的替换后搜索这些URI - SELECT ... FROM ... WHERE uri = REPLACE(@@uri, ":", "_")