我在我的网站上使用 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 过滤器和无扩展)。