Urlencode转义斜杠 404错误

4
http://localhost/foo/profile/%26lt%3Bi%26gt%3Bmarco%26lt%3B%2Fi%26gt%3B

上面的网址给我返回了一个404错误,这是网址的代码:urlencode(htmlspecialchars($foo));,至于$foo,它的值是<i>badhtml</i>
当没有需要编码的内容时,比如marco,这个网址可以正常工作。
谢谢。=D
更新:我应该捕获URI编码部分的段落,因此不应该出现404错误。
那里没有任何文档,marco只是我需要从数据库中获取某个人信息的字符串。如果用户不存在,它也不会抛出那个丑陋的错误。
稍微有点想法,问题出在哪里:我发现如果我使用<i>badhtml<i>,它可以正常工作,但是<i>badhtml</i>就不行了,我该怎么做才能保留<i>中的/
它可能会将请求视为http://localhost/foo/profile/<i>badhtml<**/**i>

1
那个位置有文档吗?你是否有一个将该请求发送到PHP的重写?我们需要更多信息来帮助你。 - Bailey Parker
我没有使用任何重写,而是使用CodeIgniter的PHP框架函数捕获了URI段,但正常值可以正常工作,所以这似乎不是问题。 - siaooo
你可能正在使用重写,CI只是为你完成了它。 - Pekka
我觉得我知道问题出在哪里了,请再次检查更新。 - siaooo
好的,这很聪明哈哈。谢谢。 - siaooo
显示剩余9条评论
3个回答

2

由于参数中有斜杠/,因此它被解释为路径名分隔符。

因此,解决方案是将所有斜杠的出现替换为不会被解释为分隔符的内容,例如\u2044。在读取参数时,将所有的\u2044替换回普通斜杠即可。

(我选择了\u2044,因为这个字符看起来非常像普通的斜杠,但当然你可以使用任何永远不会出现在参数中的内容。)


1

很可能是正则表达式处理URL重写时不喜欢URL编码字符串中的某些字符。这很可能是httpd/apache的问题,而不是PHP的问题。最好的猜测是从查看包含URL重写规则的.htaccess文件开始。

这个问题假设你正在尝试通过URL传递参数,而不是访问名为<i>badhtml</i>的文件。


-1

李斯特先生,你表现得太棒了。

“因此,解决方案是用不被解释为分隔符的其他字符替换所有斜杠的出现。 \u2044 或其他什么字符。在读取参数时,将所有 \u2044 替换回正常的斜杠。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接