﻿# 分享一個在 .NET / C# / ASP.NET 中修改網址結構的好方法

我們有個常見的功能是限制使用者導向到 SSL 的網頁，這時我們就必須修改 HTTP 要求(Request)的網址到 https 的網址，或是需要修改網址的部分結構(例如 schema 或 port 等等)，這時我們可能會用字串取代 [String.Replace 方法](http://msdn.microsoft.com/zh-tw/library/system.string.replace.aspx) (如下範例)，但這種寫法有很多瑕疵，以下是本篇文章的分析報導。

第一種：無法區分大小寫，就是若遇到網址並非全部都大寫時，就會失敗。

```
string newUrl = Request.Url.ToString().Replace("http:", "https:");
```

第二種：此法會將 QueryString 弄壞，因為 UrlEncode 過的文字是必須需分大小寫的！

```
string newUrl = Request.Url.ToString().ToLower().Replace("http:", "https:");
```

第三種：自己重新組合網址 ( 可參考我這篇文章: [ASP.NET 如何取得 Request URL 的各個部分](/post/2008/02/10/How-Do-I-Get-Paths-and-URL-fragments-from-the-HttpRequest-object))

```
string newUrl = Request.Url.Scheme + "://" + Request.Url.Authority + Request.RawUrl;
```

   第三種方法雖然可行，不過也不完美，因為網址的結構還包括很少見的 Username 與 Password 部分。

   例如以下網址都是有效且有用的 URL，由於網址的多變性讓我們自己組網址變得程式碼不漂亮：

```
ftp://username:password@example.com/Path/Filename.ext
```

```
http://username:password@example.com/Path/Filename.ext?key=val#hashid
```

最後，我的終極方案就是直接利用 .NET Framework 內建的 [UriBuilder 類別](http://msdn.microsoft.com/zh-tw/library/system.uribuilder.aspx)幫我修改網址的部分元素，若是再搭配 C# 3.0 的 [Object Initializers](http://msdn.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic13) 特性那程式碼的可讀性將會非常高。

```
string u = new UriBuilder(Request.Url) { Scheme = Uri.UriSchemeHttps, Port = 443 }.ToString();
```

在 Visual Studio 中還有 Intellisense 可用，在開發介面方面也十分友善，我覺得算是個完美的解法。

![UriBuilder 類別](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/444289750c55508894a7-image.png "UriBuilder 類別") 

**相關連結**

-   [講解 URL 結構與分享幾個相對路徑與絕對路徑的開發技巧](/post/2008/10/19/URL-URI-Description-and-usage-tips)
-   [UriBuilder 類別](http://msdn.microsoft.com/zh-tw/library/system.uribuilder.aspx)
-   [Uri 類別](http://msdn.microsoft.com/zh-tw/library/system.uri.aspx)
-   [C# 3.0 - Object Initializers](http://msdn.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic13)
