Url编码#(%23)在ASP.NET应用程序中导致404

时间:2010-09-24 07:13:59

标签: asp.net silverlight iis url encoding

我有一个深度链接的Silverlight RIA尝试使用Twitter OAuth回调。 RIA中回调“页面”的URL是:

http://example.com/RiaTestPage.aspx#callback
只要#符号是URL编码的话,Twitter就会回拨这个URL;所以我提供给Twitter的回调网址是:

http://example.com/RiaTestPage.aspx%23callback

RiaTestPage.aspx当然存在,但是当Twitter回调这个URL时,我得到的是404(来自VS 2010 ASP.NET开发服务器)

  应用程序中的服务器错误

     

无法找到资源。

     

描述:HTTP 404.您正在查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用。请查看以下网址,确保拼写正确。

     

请求的网址:/ RiaTestPage.aspx#callback

虽然#符号已在上面的错误消息中正确解码,但404似乎是编码#符号的结果。如果我手动更改导致404的回调网址,

http://example.com/RiaTestPage.aspx%23callback

到此:

http://example.com/RiaTestPage.aspx#callback

RIA中的回调页面正常加载。为什么我在这种情况下收到404?

3 个答案:

答案 0 :(得分:5)

您收到404错误,因为#callback部分不是网址的一部分。它是浏览器使用的书签,它从未在请求​​中发送到服务器。如果您对哈希进行编码,它将成为文件名的一部分,而且没有名为RiaTestPage.aspx#callback的文件。

答案 1 :(得分:2)

Guffa已经解释了问题的原因。但是存在几种解决方案:

1。重定向服务:

对您发布的网址使用重定向服务(如bit.ly,甚至是您自己的服务器)。它将提供Twitter允许的标准链接,并将其发送到您网站上的正确页面。 这些服务还可以缩短网址,这对Twitter帖子来说是个优势

2。自定义404:

在您的网站上实施自定义404页面,当您的示例中的特定网址进入时,请更正编码并重定向到正确的网页。

3。 只需添加一个?到你的链接!:

? character标记文件规范的结束和参数的开始。书签之前实际上不需要参数,因此该URL应适用于Twitter链接:

http://example.com/RiaTestPage.aspx?%23callback

将致电

http://example.com/RiaTestPage.aspx?#callback

与:

相同
http://example.com/RiaTestPage.aspx#callback

答案 2 :(得分:1)

在IIS7中,您可以使用URL重写模块或手动编辑web.config文件以添加此重写规则,将%23转换为#。它看起来并不直观,因为你把#放在正则表达式查找和替换框中,但是它有效。 这会将www.domain.com/page%23anchorname等传入的网址重定向到www.domain.com/page#anchorname,并避免404错误。

<rewrite>
  <rules>
     <rule name="unencode hashmark">
        <match url="^([^\#]*)#(.*)$" />
        <action type="Redirect" url="{R:1}#{R:2}" />
     </rule>
  </rules>
</rewrite>