2011-12-21 43 views
10

幾年前,我創建了一個數據庫驅動的ASP.NET網站,它使用單個APSX頁面來顯示所有網站頁面。因此,網站的所有網址都採用以下格式:加號登錄ASP.NET網站的查詢字符串

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

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

/main.aspx?page=Third+Page 

的main.aspx頁面獲取查詢字符串數據(頁+標題+一個例如),並使用它作爲一個重點來拉動適當的文章來自SQL服務器數據庫的內容。頁面的實際標題以空格而不是加號存儲在數據庫中(例如「頁面標題一」)。

在URL查詢字符串中使用+號作爲分隔符的糟糕決定最近導致搜索引擎出現很多問題(重複的內容等),所以我想修復它,但不更改URL 。

我想要做的是,當搜索引擎或訪客試圖訪問錯誤的URL中缺少的+號,並具有白色空格代替,例如:

/main.aspx?page=Page Title One 

我想要做301永久重定向到:

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

爲了能夠做到這一點,我需要檢查,如果查詢字符串值有加號或空格,但是當我得到的Request.QueryString [「頁」]的值即使實際quesry字符串有加上它我仍然得到字符串與白色空間「頁標題一」。

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

我該怎麼做?

回答

2

嗯,當然在任何情況下你都不能在URI中放置空格。你可以做的是把%20放在其中,在URI中的任何一點上編碼空間的方式,以及+是在查詢部分中編碼空間的常規方式,並且推薦的方式是在該部分它是因爲%20可能會導致問題。

因爲這是一個implementaiton細節應用程序/ x-WWW窗體-urlencoded和我們通常關心的實際發送的數據,Request.QueryString[]做的轉義爲你,把兩者+%20進入的空間。

你想看看Request.RawUrl(返回一個字符串)或Request.Url,它返回Uri。可能最簡單的方法是將Request.Url填入UriBuilder,這樣您就可以更改查詢並返回Uri

不過,我建議相反的方法,如果您遇到重複內容的問題,由於在查詢字符串編碼空間的兩種可能的方式,去與建議規範轉來轉%20的情況下進入+而不是其他方式。

var u = Request.Url; 
if(u.Query.Contains("%20")) 
{ 
    var ub = new UriBuilder(u); 
    Console.WriteLine(ub.Query); 
    string query = ub.Query; 
    //note bug in Query property - it includes ? in get and expects it not to be there on set 
    ub.Query = ub.Query.Replace("%20", "+").Substring(1); 
    Response.StatusCode = 301; 
    Response.RedirectLocation = ub.Uri.AbsoluteUri; 
    Response.End(); 
} 
+0

我的網址一直只使用加號而不是空白或%20,但是我在Google中看到緩存頁面,如下所示2:/main.aspx?page=KW1 KW2和/main.aspx?page=KW1% 20KW2,這兩個都是錯誤的,並導致重複的內容問題。現在我想將它們301添加到/main.aspx?page=KW1+KW2的正確URL中。 – 2011-12-21 20:48:45

+0

這就是我正在解釋的。不知道什麼是不明確的,所以添加了希望解釋的代碼示例。 – 2011-12-21 20:59:24

+0

感謝Jon,這正是我需要的:)。我如何將問題標記爲已回答? – 2011-12-21 21:08:56

3

+符號被解釋爲URL的空間。

也就是說,爲了URL編碼空間,您可以使用%20+

請參見this SO answer以「URL編碼空格字符:+或%20?」

4

使用Request["key"]時,它會自動將所有「+」號轉換爲空格。您需要使用Request.RawUrl來查看是否有加號。

此外,您可以使用System.Web.HttpUtility.ParseQueryString解析任何字符串查詢。 您可以測試Request.QueryString.ToString().Contains("+")是否爲真,並從中執行邏輯。

+0

這正是我的問題。我希望能夠區分以下2個GET請求:/main.aspx?page=KW1+KW2和/main.aspx?page=KW1 KW2。 – 2011-12-21 20:32:35

+0

查看我原來的帖子。看起來像'Request.QueryString.ToString()。Contains(「+」)'會給你,如果它的第一或第二種情況。 – 2011-12-21 20:41:20

+0

是的,但這不會以下面的格式/main.aspx?page=KW1 KW2 + KW3解決錯誤的URL。 – 2011-12-21 20:53:25

0

你可以試試這個:

Request.QueryString["page"].Trim();