2015-07-01 47 views
1

我很想知道Stackoverflow如何重寫URL。
例如重寫URL的有效方法

http://stackoverflow.com/questions/7325278/group-by-in-linq 
http://stackoverflow.com/questions/7325278/ 
http://stackoverflow.com/questions/7325278 
http://stackoverflow.com/questions/7325278/random-blah 

他們都重定向到 http://stackoverflow.com/questions/7325278/group-by-in-linq

我必須做一些非常相似,但我要訪問數據庫來獲得(在這種情況下,問題編號)重定向URL針對關鍵,還是應該在我的應用中保存字典或者有更好的方法來做到這一點?
很高興知道SO是如何做到的。

更新:
用戶管理的URL都是301d到規範的URL。正如其中一個答案中指出的那樣,從操作重定向有效嗎?

回答

2

這不是關於IIS URL重寫。它關於ASP.NET路由。
它看起來確實很像字符串問題ID簡單地被忽略。由於它在沒有這個字符串參數的情況下工作,它可能用於用戶的方便。

在ASP.NET MVC中你有路由。如果你不太瞭解它 - 請閱讀這兩篇文章:at MSDN,at ASP.NET

默認情況下,您有以下RouteConfig

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Welcome", action = "Index", id = UrlParameter.Optional } 
); 

這意味着,如果你有這樣一個動作:

public class InformationController : Controller 
{  
    public ActionResult Get(int id) 
    { 
     // ... 
    } 
} 

然後你就可以訪問它的方式如下:

http://yourwebsite.com/Information/Get/7325278 

這與

相同
http://yourwebsite.com/Information/Get/?id=7325278 

如果你想要一個額外的參數,你可以改變你的路線以使用2,3或更多的參數。

然後,你會做一個

http://yourwebsite.com/Information/Get/7325278/group-by-in-linq 

這是一個相當於

http://yourwebsite.com/Information/Get/?id=7325278&someParam=group-by-in-linq 

這裏是StackOverflow topic about routes with multiple arguments

假設您現在有多個參數路由。 現在,您可以在行動中描述任何邏輯。例如,你可以在你的代碼中使用這個參數,或者你可以忽略第二個參數並重定向到必要的URL(StackOverflow是如何實現的)。
也許,我的僞僞代碼將幫助您:

public ActionResult Get(int id, string unnecessaryString) 
{ 
    var question = questionsDbProvider.getById(id); 
    if (question.ShortUrlText == unnecessaryString) 
     return RedirectToAction("Get", new { 
      id = id, 
      unnecessaryString = question.ShortUrlText 
     }); 
} 

這樣的行動代碼將檢查它是否是第二個參數是正確的,否則重定向糾正。
301重定向正是StackOverflow所做的,它使它以這種方式工作。您可以在瀏覽器開發人員工具的「網絡」選項卡中查看它。

+0

是的,我知道這一點,但在我的提問時指出,我不想打分貝每次在使用相同的密鑰,但用不同的幫助文件(假設關鍵是問題數量和幫助文件是用戶上下文文本),特別是當我緩存頁面。我會更新這個問題來考慮緩存。 –

+0

@NullHead 301重定向正是StackOverflow所做的,它使它以這種方式工作。您可以在瀏覽器開發人員工具的「網絡」選項卡中查看它。您可以使用ASP.NET緩存來避免不必要的請求。 –

+0

我在我的更新中提到過。我的問題是,從Action執行301操作有多高效? –