Код с кодом URL (%23), вызывающий 404 в приложении ASP.NET

У меня есть глубокая ссылка Silverlight RIA, пытающаяся использовать обратный вызов Twitter OAuth. URL обратного вызова "страница" в RIA:

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

Twitter перезванивает на этот URL, пока знак # закодирован; поэтому URL обратного вызова, который я предоставляю в Twitter:

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

RiaTestPage.aspx, конечно, существует, но когда Twitter перезванивает по этому URL, я получаю 404 (с сервера разработки VS 2010 ASP.NET)

Ошибка сервера в приложении

Этот ресурс не может быть найден.

Описание: HTTP 404. Ресурс, который вы ищете (или одна из его зависимостей), мог быть удален, изменилось его имя или временно недоступен. Пожалуйста, просмотрите следующий URL и убедитесь, что он написан правильно.

Запрашиваемый URL: /RiaTestPage.aspx#callback

Хотя знак # был правильно декодирован в приведенном выше сообщении об ошибке, 404, похоже, является результатом закодированного знака #. Если я вручную изменить URL-адрес обратного вызова, который вызвал 404,

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

к этому:

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

Страница обратного вызова в RIA загружается нормально. Почему я получаю 404 в этой ситуации?

3 ответа

Решение

Вы получаете ошибку 404, потому что #callback часть не является частью URL. Это закладка, используемая браузером, и она никогда не отправляется в запросе на сервер. Если вы закодируете хеш, он вместо этого станет частью имени файла, и файл с именем не будет RiaTestPage.aspx#callback,

Причину проблемы уже объяснил Гуффа. Существует несколько решений:

1. Служба перенаправления:

Используйте службу перенаправления (например, bit.ly или даже ваш собственный сервер) для публикуемого вами URL. Он предоставит стандартную ссылку, которую разрешит Twitter, и отправит ее на нужную страницу вашего сайта. Эти сервисы также могут сделать URL намного короче, что является плюсом для постов в Twitter.

2. Кастом 404:

Реализуйте пользовательскую страницу 404 на своем сайте, и при появлении определенных URL, таких как ваш пример, исправьте кодировку и перенаправьте на нужную страницу.

3. Просто добавить? на вашу ссылку!

? символ обозначает конец спецификации файла и начало параметров. Параметры не требуются перед закладкой, поэтому этот URL должен работать для ссылки в Twitter:

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

позвоню

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

что так же, как:

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

В IIS7 вы можете использовать модуль перезаписи URL или вручную отредактировать файл web.config, чтобы добавить это правило перезаписи, которое превращает%23 в #. Это не выглядит интуитивно понятным, потому что вы ставите # в оба поля поиска и замены регулярных выражений, но это работает. Это перенаправляет входящие URL-адреса, такие как 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>
Другие вопросы по тегам