サイトで URL 書き換えを使用して、http: //mysite.com/index.aspx?user=john
ではなく
http://mysite.com/users/johnのような URL を取得しています。
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アプローチにあるようです.404アプローチなしで試してみると(そしてエクステンションレス機能が失われると)ポストバックが機能するからです。それが私が要求するときです:
http://mysite.com/users/john.aspx
これを解決できますか、それとも私の要件を満たす他のソリューションがありますか (IIS6、サーバーアクセス/ISAPI フィルターなし、拡張機能なし)。