Я использую перезапись 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-фильтра и без расширения).