Asp.net

將 default.aspx 重定向到根虛擬目錄

  • March 20, 2014

我有一個簡單的 ASP.NET 3.5 應用程序在虛擬目錄下的 IIS7 下執行。所以我的應用程序的 URL 就像http://example.com/app。我想 301 將請求重定向到 example.com/app/default.aspx 到 example.com/app 以獲得更好的 SEO。我必須只通過程式碼進行此重定向,而不是通過任何 IIS 設置。我無法通過本文中提到的程式碼這樣做:

http://www.4guysfromrolla.com/articles/072810-1.aspx

編碼:

if (request.RawUrl.Equals("/default.aspx"))
{
newUrl = string.Format("{0}://{1}{2}",
                request.Url.Scheme,
                request.Url.Authority,
                request.RawUrl.Remove(request.RawUrl.LastIndexOf("/default.aspx", StringComparison.OrdinalIgnoreCase)));

              context.Response.Status = "301 moved permanently";
              context.Response.AddHeader("Location", newUrl);
}

當應用程序位於虛擬目錄下時,似乎進入了無限循環。即使在 301 重定嚮導致無限循環之後,request.RawUrl 屬性也始終返回“/default.aspx”。我該如何解決這個問題?

謝謝,

阿西夫

只要您沒有子目錄,上面的程式碼就可以正常工作。AFAIK,它是 ASP.NET 中的一個錯誤:當 URL 沒有該副檔名時,Request.RawUrl 不應包含“/default.aspx”。我已經測試了您的程式碼,它在沒有子目錄的情況下工作正常,但是如果 default.aspx 在目錄下,則 Request.RawUrl 對象無法擺脫 default.aspx 並因此導致無限循環。

處理子目錄和維護 url 變數的輕微修改。可能存在更好的比較和替換功能,但這對我來說適用於 IIS 7。

if (Request.RawUrl.ToLower().Contains("/default.aspx"))  // use Contains instead of EndsWith to handle url vars
{
   string newUrl = string.Format("{0}://{1}{2}",
                   Request.Url.Scheme,
                   Request.Url.Authority,
                   Request.RawUrl.ToLower().Replace("default.aspx", ""));  // don't remove the trailing slash so url vars are maintained

   Response.Clear();
   Response.Status = "301 Moved Permanently";
   Response.AddHeader("Location", newUrl);
   Response.End();
}

引用自:https://stackoverflow.com/questions/3609763