Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Меняем URL’ы на лету

Источник: realcoding.net

Одним из наиболее слабоосвещённых – но потенциально полезных – методов .NET Framework в части, касающейся ASP.NET, является метод класса HttpContext RewritePath. Этот метод используется ASP.NET для получения сессионного идентификатора из URL’a, при задействованном состоянии сессии без использования куки. Метод RewritePath также может быть использован и для подмены URL’a внутри приложения. Для демонстрации предположим, что у нас есть следующий ASPX-файл, который мы назовём RewritePath.aspx:

<html>
    <
body>
    <
h2><asp:Label ID=Output RunAt=server /></h2>
    </
body>
    </
html>

    <
script language=C# runat=server>
   
void Page_Load (Object sender, EventArgs e)
    {
   
string id = Request.QueryString[ID];
    if (
id != null && id != String.Empty) {
    switch (
id) {
    case
1:
   
Output.Text = Give me chastity and +
   
continence, but not yet.;
    break;

    case
2:
   
Output.Text = A programmer is a device +
   
for turning coffee into code.;
    break;

    case
3:
   
Output.Text = Blessed is the man who, +
   
having nothing to say, abstains from +
   
giving wordy evidence of the fact.;
    break;
    }}}
   
</script>

Если эту страницу поместить в виртуальный каталог Foo, то следующие три URL’a отобразят три разных утверждения:

http://.../foo/rewritepath.aspx?id=1
http://.../foo/rewritepath.aspx?id=2
http://.../foo/rewritepath.aspx?id=3

А теперь представьте, что вы хотите предоставить вашим пользователям получать эти утверждения с использованием вот таких ‘фантомных’ URL’ов:

http://.../foo/quotes/page1.aspx
http://.../foo/quotes/page2.aspx
http://.../foo/quotes/page3.aspx

Этого можно добиться, использовав немного магии – на лету превратив URL вида .../quotes/page1.aspx в URL вида .../rewritepath.aspx?id=1 – использовав метод HttpContext.RewritePath. Хитрость состоит в сборе запросов вида /quotes/page1.aspx, /quotes/page2.aspx из ASP.NET HTTP-канала и превращения их в запрос вида /rewritepath.aspx?id=1, /rewritepath.aspx?id=2 и т.д.. Вот файл Global.asax который это и делает:

<script language=C# runat=server>
   
void Application_BeginRequest (Object sender, EventArgs e)
    {
   
// TODO: превращение пути вида
    // .../quotes/page1.aspx в путь вида
    // .../rewritepath.aspx?id=1
    //
   
HttpContext context = HttpContext.Current;
   
string oldpath = context.Request.Path.ToLower ();
   
string token = /quotes/page;
   
int i = oldpath.IndexOf (token);
   
int len = token.Length;
    if (
i != -1) {
   
int j = oldpath.IndexOf (.aspx);
    if (
j != -1)
    {
string id = oldpath.Substring (i + len, j - (i + len));
   
string newpath = oldpath.Replace (token + id + .aspx, /rewritepath.aspx?id= + id);
   
context.RewritePath (newpath);
    } } }
   
</script>

Application_BeginRequest вызывается в начале каждого запроса. В этой реализации происходит выделение части URL’a (например, /foo/quotes/page1.aspx), замена этой части на ссылку на реальной странице (например, /foo/rewrite.aspx?id=1) и вызов метода RewritePath для перенацеливания запроса. Попробуйте следующее: перепишите файл RewritePath.aspx в каталог wwwroot на вашем веб-сервере и попробуйте набрать в адресной строке вашего браузера следующее:
http://localhost/quotes/page1.aspx
Сгенерируется ошибка "page not found". Теперь скопируем Global.asax в wwwroot и попробуем ещё раз. На этот раз всё заработает благодаря смене URL’a в событии Application_BeginRequest.
RewritePath используется во многих приложениях. Например, вы можете использовать этот метод для занесения страниц, имеющих параметры в URL’e, в избранное. Этот метод также можно использовать для сокрытия реальных путей в вашем приложении из соображений безопасности. Ну а теперь, когда вы знаете, что метод RewritePath существует, то наверняка сможете найти ему и другое применение.



Похожие статьи:
- HTML_AJAX в действии
- Создаем статистику для сайта своими руками на ASP.NET
- Почему веб-зеваки ничего не стоят
- Всплывающее меню для одностраничного портала
- Сложные графики и диаграммы в ASP.NET. Часть третья - HttpHandler/System.Drawing
- Категориальное упорядочение результатов запроса
- Средства безопасности ASP.NET. Аутентификация
- XML+MSSQL+ASP.NET. Часть 1.
- Концептуальный подход к дизайну сайта
- Разница между HttpModule и HttpHandler
- Очищаем HTML от лишних знаков
- Обзор DetailsView
- Лекция 6. Работа с базами данных.


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.003]