Проблема обратной передачи при использовании URL Rewrite и 404.aspx - PullRequest
3 голосов
/ 04 января 2009

Я использую перезапись URL на своем сайте, чтобы получить такие URL, как:
http://mysite.com/users/john
вместо
http://mysite.com/index.aspx?user=john

Чтобы добиться этого переписывания без расширения с IIS6 и без доступа к хост-серверу, я использую «404-подход». Когда запрос, который сервер не может найти, выполняется сопоставление 404-страницы, поскольку это aspx-страница, которую можно выполнить перезаписью (я могу настроить отображение 404 с помощью панели управления на хостинг-сервисе).

Это код в Global.asax:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string url = HttpContext.Current.Request.Url.AbsolutePath;
    if (url.Contains("404.aspx"))
    {
        string[] urlInfo404 = Request.Url.Query.ToString().Split(';');
        if (urlInfo404.Length > 1)
        {
            string requestURL = urlInfo404[1];
            if (requestURL.Contains("/users/"))
            {
                HttpContext.Current.RewritePath("~/index.aspx?user=" + GetPageID(requestURL));              
                StoreRequestURL(requestURL);
            }
            else if (requestURL.Contains("/picture/"))
            {
                HttpContext.Current.RewritePath("~/showPicture.aspx?pictureID=" + GetPageID(requestURL));
                StoreRequestURL(requestURL);
            }
        }
    }
}

private void StoreRequestURL(string url)
{
    url = url.Replace("http://", "");
    url = url.Substring(url.IndexOf("/"));
    HttpContext.Current.Items["VirtualUrl"] = url;
}

private string GetPageID(string requestURL)
{
    int idx = requestURL.LastIndexOf("/");
    string id = requestURL.Substring(idx + 1);
    id = id.Replace(".aspx", ""); //Only needed when testing without the 404-approach
    return id;
}

И в Page_Load на своей главной странице я установил правильный URL-адрес в атрибуте действия в теге формы.

protected void Page_Load(object sender, EventArgs e)
{
    string virtualURL = (string)HttpContext.Current.Items["VirtualUrl"];
    if (!String.IsNullOrEmpty(virtualURL))
    {
        form1.Action = virtualURL;
    }
}

Перезапись работает нормально, но когда я выполняю обратную передачу на странице, обратная передача не выполняется, можно ли это как-то решить?

Проблема, похоже, связана с подходом 404, потому что, когда я пытаюсь без него (и теряет функцию без расширения), работает обратная передача. Вот когда я запрашиваю:
http://mysite.com/users/john.aspx

Может ли это быть решено или есть какое-либо другое решение, отвечающее моим требованиям (IIS6, без обслуживания, ISAPI-фильтра и без расширения).

Ответы [ 7 ]

9 голосов
/ 08 августа 2010
form1.Action = Request.RawUrl

в сочетании с

HttpContext.Current.RewritePath("/Default.aspx", true); 

очень хорошо работает для меня.

установка атрибута формы была частью, которую мне не хватало ...

Спасибо за решение !!!

4 голосов
/ 04 января 2009

Скотт Гатри рассматривает различные способы сделать это здесь без доступа IIS:

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

Лично я создал HTTP-модули в прошлом, и их довольно легко собрать.

3 голосов
/ 22 февраля 2010

form1.Action = Request.RawUrl также, как это написано в C #, поместите его в метод загрузки страницы

1 голос
/ 19 апреля 2010

попробуйте что-то вроде этого:

            if (Request.HttpMethod == "GET" && shouldChangeUrl)
            {
                urlRedirect = "REAL-URL-HERE";

                _postBackUrl = urlRedirect;
                Context.RewritePath(urlRedirect);
            }
            else
                //If Post Back (Request.HttpMethod="POST")
                Context.RewritePath(_postBackUrl);

Таким образом, вы сохраняете реальный URL для обратной передачи в переменной (здесь: _postBackUrl) при перезаписи URL, а затем используете его только при обратной передаче.

1 голос
/ 24 ноября 2009

Вы можете просто использовать ниже:

form1.Action = Request.RawUrl

Я не уверен, что это было бы в C #, но это то, что это в VB, и это работает удовольствие

1 голос
/ 04 января 2009

Я бы начал с установки Live Http Headers и посмотрел, что происходит с запросами Http.

Ааа, в этой статье это объясняется, похоже, что атрибут действия тега формы неверен:

Одна хитрость, с которой люди часто сталкиваются при использовании ASP.NET и Url-Rewriting, связана с обработкой сценариев обратной передачи. В частности, когда вы размещаете элемент управления <form runat="server"> на странице, ASP.NET автоматически по умолчанию выведет атрибут «action» разметки, чтобы указать на страницу, на которой он находится. Проблема при использовании перезаписи URL-адресов заключается в том, что URL-адрес, отображаемый элементом управления, является не исходным URL-адресом запроса (например, / products / books), а переписанным (например, /products.aspx?category). = книга). Это означает, что когда вы выполняете обратную передачу на сервер, URL-адрес не будет вашим хорошим чистым.

В ASP.NET 1.0 и 1.1 люди часто прибегали к подклассу элемента управления <form> и создавали свои собственные элементы управления, которые правильно выводили действие, которое нужно использовать. Несмотря на то, что это работает, в конечном итоге это выглядит немного грязно - поскольку это означает, что вам нужно обновить все страницы, чтобы использовать этот альтернативный элемент управления формой, и иногда могут возникать проблемы с конструктором WYSIWYG в Visual Studio.

Хорошая новость заключается в том, что в ASP.NET 2.0 есть более чистый прием, который можно использовать для перезаписи атрибута «action» в элементе управления <form>. В частности, вы можете воспользоваться новой архитектурой расширяемости адаптера элемента управления ASP.NET 2.0, чтобы настроить отображение элемента управления <form> и переопределить его значение атрибута «action» указанным вами значением. Это не требует от вас изменения какого-либо кода на ваших страницах .aspx. Вместо этого просто добавьте файл .browser в папку / app_browsers, в которой зарегистрирован класс адаптера управления, который будет использоваться для вывода нового атрибута «action» ...

0 голосов
/ 15 мая 2009

Проблема в обработке 404. Ваша форма публикуется на несуществующей странице, ASP.NET перенаправляет запрос на страницу 404 и теряет все данные обратной передачи.

Единственное решение - установить атрибут действия формы для существующей страницы, поэтому пользователи увидят index.aspx? User = john, когда они отправят форму. Для SEO это не будет проблемой, поскольку сканеры не выдают сообщения и, следовательно, не видят уродливый адрес.

...