2011-12-22 111 views
3

我有一個數據庫驅動的ASP.NET站點,它使用單個APSX頁面來顯示所有站點頁面。因此,網站的所有網址都採用以下格式:ASP.NET自定義404

/main.aspx?page=Page+Title+One 

/main.aspx?page=Another+Article+Title 

不幸的是谷歌已經收錄許多不存在的網址,大多切割查詢字符串的一部分。例如:

/main.aspx?page=Page+Title or /main.aspx?page=Page 

,而不是正確的:

/main.aspx?page=Page+Title+One (this is indexed by Google as well of course). 

我試圖實現,如果查詢字符串的頁面名稱並沒有在我的數據庫匹配的條目,以強制404錯誤服務器端,首先是爲了更好的用戶體驗,其次告訴Google這些頁面不存在。

這是我的代碼,並沒有工作。我的意思是它只是顯示在IE 8中的空白頁面,並錯誤在最新的Firefox:

System.Web.HttpContext.Current.Response.Clear(); 
System.Web.HttpContext.Current.Response.StatusCode = 404; 
System.Web.HttpContext.Current.Response.Status = "404 Not Found"; 
System.Web.HttpContext.Current.Response.End(); 

我看到我日誌中的404碼,但是我沒有得到重定向到我的網頁指定我的錯誤頁面.config:

<customErrors mode="On"> 
     <error statusCode="404" redirect="404.aspx"/> 
</customErrors> 

我在做什麼錯了?

另一件讓我擔心的事情是,如果我在任何查詢字符串條目上成功強制404錯誤,而這些條目在我的數據庫中沒有匹配,那麼不會影響main.aspx頁面本身,頁面以及?這裏是我的意思:

I 404 main.aspx?page = Non-Existing-Title,但是,我的404影響main.aspx與包括有效的任何查詢字符串,例如main.aspx?page = Existing-Title 。

該網站在IIS6/Win 2003上運行。

感謝您的幫助!

約翰

回答

2

爲什麼不建立搜索引擎友好的URL - 它很容易ASP.NET routing。這裏有另一個quick-start用於使用web表單進行路由。

因爲你有數據驅動的網站,我還建議你每天說有效的網址build a site-map並提交給搜索引擎。

就自定義錯誤而言,可能是Web服務器(IIS6)重寫顯示自己的自定義錯誤頁面 - 請檢查this以管理IIS端的自定義錯誤消息。

編輯
目前你看到空白的404頁,因爲你沒有發出任何錯誤頁面內容(你的代碼設置狀態代碼,然後結束響應)。你當然可以使用IIS端設置來設置你的自定義錯誤頁面,但是如果你想顯示你的aspx頁面,那麼我建議你在你的錯誤頁面(404.aspx)上做Server.Transfer。在404.aspx中,您必須將狀態代碼設置爲404,但不要執行Response.End,否則將不會提供錯誤頁面內容。
最後請記住,瀏覽器在錯誤頁面中具有最小內容大小的閾值,如果內容大小小於它將顯示它自己的錯誤頁面。對於IE,404錯誤的大小爲521字節。看到這篇博文:http://perishablepress.com/press/2008/01/21/important-note-for-your-custom-error-pages/

+0

我不想更改我的URL結構,我想強制404錯誤,而不是。 – 2011-12-22 14:20:00

+0

@JohnCollins,你的舊URL結構仍然會受到支持。但是,今後,您可以擁有友好的網址。無論URL結構如何,提交站點地圖總是一個好主意。最後,請參閱我編輯的404錯誤。 – VinayC 2011-12-23 04:15:39

0

它不會使用自定義錯誤,因爲那裏有一個頁面,名爲main.aspx。

做這個恕我直言的最好方法是創建一個HTTPModule並在那裏做檢查。

E.g.從http://forums.asp.net/t/762031.aspx/1

public class ErrorModule : IHttpModule 
{ 

    //Default implementation details left out… 
    private void FakeA404(Object source, EventArgs e) 
    { 
     // do your URL checking here .. 
     HttpContext.Current.Response.StatusCode = 404; 
    } 

    public void Init(HttpApplication context) 
    { 
     context.AuthenticateRequest += new EventHandler(this.FakeA404); 
    } 

    public void Dispose(){ 

    } 
} 

但是我確實與VinayC同意關於友好的網頁的URL 100%。你可以設置你的路由,以便它會轉到你當前的main.aspx?page = blah + blah2 - 或者你可以使用一個HTTPModule(在鏈中足夠早的影響事物)來重寫路徑。

與您現有的鏈接,我會發出一個301燙髮重定向到新的網址,所以谷歌會得到很好的更新。

另一種選擇是使用不同的分隔符作爲obv谷歌不喜歡+。我會使用下劃線Page_Title_One

+0

我不想更改我的網址結構。重定向到404頁的答案對我來說不起作用,因爲我想強制一個真正的404錯誤。如果我重定向狀態代碼搜索引擎看到不會是404. – 2011-12-22 14:20:20

+0

好的更新評論。 – 2011-12-22 15:07:00