Как автоматически перенаправить URL-адреса по шаблонам в ASP.NET / IIS 6? - PullRequest
0 голосов
/ 09 марта 2011

Я подумал, что это должно быть простым и понятным делом, но после долгих попыток с этим мне придется обратиться за помощью.

Мне нужно перенаправить все запросы на мой вебприложение, соответствующее следующему шаблону - "^(http://[^/]+/blogs/[^/.]+)/?$" по пути "$1/Default.aspx".

(Использование английского, а не регулярного выражения: http://myapp/blogs/randomdirthatdoesntexist -> http://myapp/blogs/randomdirthatdoesntexist/default.aspx)

Подкаталоги в "блогах" не существуют физически, вместо этого сторонний продукт обрабатывает запросыto randomdir / Default.aspx ", но когда вы переходите к randomdir /, вы получаете 404, не найденных, что я и пытаюсь исправить.

Я пытался использовать global.asax, а также HttpHandler, но я не мог заставить ни одного из них запускать запросы к этим 404 путям.

Итак, вкратце, что я должен сделать, чтобы перенаправить пути несуществующих каталогов?

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Я сделал нечто похожее на это, установив страницу ошибок для 404-х в IIS на страницу, которую вы создаете.Эта страница может получить доступ к запрашиваемой странице и выполнить некоторую дополнительную логику.Таким образом, 404 для randomdirthatesestextex / все еще происходит, но обработчик 404 замечает это и перенаправляет на randomdirthatdoesntexist / default.aspx.

Я выкопал свой старый код и немного подправил его, чтобы сделать то, что вам нужно в чрезмерномупрощенный способ, но у меня нет нигде IIS6 для тестирования:

protected void Page_Load(object sender, EventArgs e)
{
    String sQueryString = Request.RawUrl.Substring(Request.FilePath.Length);
    Regex rx = new Regex(@"^\?(?<errorcode>\d+);(?<args>.*)$", RegexOptions.ExplicitCapture | RegexOptions.Compiled);
    Match m = rx.Match(sQueryString);


    if (m.Success)
    {
        if (m.Groups["errorcode"].Value == "404")
        {
            String sArgs = m.Groups["args"].Value;
            Uri requestedUri = new Uri(sArgs);

            // You can now check the value of uri and perform redirection...
            if (requestedUri.ToString().EndsWith("/"))
            {
                Response.Redirect(requestedUri + "Default.aspx")
            }
        }
    }
    Response.StatusCode = 404;
}
0 голосов
/ 09 марта 2011

Используйте Пользовательский HttpModule или Http Handler, который находится достаточно рано в конвейере Http-запросов, чтобы соответствующим образом направлять ваши запросы до того, как будет определен любой возможный ответ 404.

См. Мои собственные вопросы и ответы; Server.Transfer или Server.RewritePath для получения более подробной информации.

...