我有一个深度链接的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?
答案 0 :(得分:5)
您收到404错误,因为#callback
部分不是网址的一部分。它是浏览器使用的书签,它从未在请求中发送到服务器。如果您对哈希进行编码,它将成为文件名的一部分,而且没有名为RiaTestPage.aspx#callback
的文件。
答案 1 :(得分:2)
Guffa已经解释了问题的原因。但是存在几种解决方案:
对您发布的网址使用重定向服务(如bit.ly,甚至是您自己的服务器)。它将提供Twitter允许的标准链接,并将其发送到您网站上的正确页面。 这些服务还可以缩短网址,这对Twitter帖子来说是个优势。
在您的网站上实施自定义404页面,当您的示例中的特定网址进入时,请更正编码并重定向到正确的网页。
? 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>