Код с кодом 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>