2008-10-21 82 views

回答

25

在使用stackoverflow的情況下,他們使用ASP.NET MVC而不是ASP.NET web表單。使用Web表單時,url指向磁盤上的文件,而MVC指向控制器操作。如果您使用的是webforms,則需要使用URL重寫。 Scott Guthrie在做URL重寫時有good article

+0

但爲什麼隱藏aspx擴展? – 2008-10-28 13:15:38

3

您可以使用ISAPI重寫(對於IIS)執行此操作和更多操作。它允許你創建友好的網址,而不需要所有醜陋的查詢字符串。它爲用戶提供了一個更友好的界面,可以讓您的內容更加可搜索。

如果您使用的是Apache,請使用mod_rewrite。

兩者的基本前提是它們採用友好的URL(就像您在本網站上看到的那樣),然後使用一系列規則(通常是指定的正則表達式)將它轉換爲內部URL或查詢字符串很容易被代碼理解。

一個例子是他們通過使用變換規則將posts/edit/<postnumber>轉換爲editPost.aspx?postNumber=<postnumber>

16

本網站使用ASP.NET MVC框架和Urls映射到非物理頁面的路由。路由傳遞給控制器​​,然後控制器決定如何顯示頁面。

9

最有可能通過其URL重寫做...

的Web服務器正在網址就像在你的瀏覽器&器的地址欄中的那些他們repointing到場景

這可能是背後的ASPX頁面在.NET HTTP模塊或一個ISAPI處理程序中完成的IIS

斯科特Gutherie在他的關於URL的網站一個很好的文章改寫

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

+0

您確定「乾淨」的URL可以通過ASP.NET中的URL重寫來完成。然而,在這種特殊情況下(stackoverflow.com),URL是由ASP.NET MVC框架的本質完成的。 – 2008-10-22 02:28:52

+0

...這就是所謂的「ASP.NET MVC的本質」在這種情況下是System.Web.Routing。 – 2009-01-29 00:36:25

-3

,並儘可能的理由:

  • 你可以改變技術(說PHP)無索引或書籤的網址,打破
  • 您的網址更「REST'ful和對應的資源,而不僅僅是文件
  • 您可以記住的網址或通過電話讀給別人更容易
4

你可以通過修改你的web.config文件來實現。

<configuration> 
<system.webserver> 
<rewrite> 
    <rules> 
      <rule name="RemoveASPX" enabled="true" stopProcessing="true"> 
       <match url="(.*)\.aspx" /> 
       <action type="Redirect" url="{R:1}" /> 
      </rule> 
      <rule name="AddASPX" enabled="true"> 
       <match url=".*" negate="false" /> 
       <conditions> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
        <add input="{URL}" pattern="(.*)\.(.*)" negate="true" /> 
       </conditions> 
       <action type="Rewrite" url="{R:0}.aspx" /> 
      </rule> 
    </rules> 
</rewrite> 
</system.webserver> 
</configuration> 
0

下面的代碼工作正常,只要在網頁的.aspx,.ashx的是在應用程序文件夾。首先解決.aspx頁面,然後是.ashx。

例如,如果您嘗試使用localhost/AppFolder/Time,它會嘗試解析localhost/AppFolder/Time.aspx,如果找不到,則使用localhost/AppFolder/Time.ashx。

P.S.

  1. 我沒有完全測試這段代碼,所以要小心。

  2. 它不考慮可能具有.aspx文件的文件夾,因此,如果您嘗試訪問/ PhysicalApplicationPath/MYFOLDER/page,則它不會解析爲/PhysicalApplicationPath/MYFOLDER/page.aspx。

代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.SessionState; 

namespace NameSpace 
{ 
    public class Global : System.Web.HttpApplication 
    { 
     private void mapearUrlAmigaveis() 
     { 
      String url = Request.Path.ToString().ToLower(); 
      int positionQuestionMarkParameter = url.IndexOf('?'); 

      String urlSemParametros = (positionQuestionMarkParameter != -1) ? url.Substring(0, (positionQuestionMarkParameter - 1)) : url; 
      String[] splitBarra = urlSemParametros.Split('/'); 
      int indexOfUltimaBarra = urlSemParametros.LastIndexOf('/'); 

      if (splitBarra.Length > 0) 
      { 
       String ultimaBarra = splitBarra[(splitBarra.Length - 1)]; 
       String caminhoLocalUltimaBarra = Request.PhysicalApplicationPath + ultimaBarra; 
       String parametros = ((positionQuestionMarkParameter != -1) ? url.Substring((positionQuestionMarkParameter - 1), (url.Length - 1)) : String.Empty); 
       if (System.IO.File.Exists(caminhoLocalUltimaBarra + ".aspx")) 
       { 
        Context.RewritePath(urlSemParametros + ".aspx" + parametros); 
       } 
       else if (System.IO.File.Exists(caminhoLocalUltimaBarra + ".ashx")) 
       { 
        Context.RewritePath(urlSemParametros + ".ashx" + parametros); 
       } 
      } 
     } 
    } 
} 
0

您可以在C#.NET這樣做是爲了用在ASP.NET您的網址自定義擴展。

讓代碼中的「.recon」爲您定製的擴展。 (即將「.recon」替換爲您自己的擴展名)

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    HttpApplication app = sender as HttpApplication; 
    if (app.Request.Path.ToLower().IndexOf(".recon") > 0) 
    { 
     string rawpath = app.Request.Path; 
     string path = rawpath.Substring(0, rawpath.IndexOf(".recon")); 
     app.Context.RewritePath(path+".aspx"); 
    } 
}