Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net NET站点如何隐藏其文件的.aspx扩展名?_Asp.net - Fatal编程技术网

Asp.net NET站点如何隐藏其文件的.aspx扩展名?

Asp.net NET站点如何隐藏其文件的.aspx扩展名?,asp.net,Asp.net,我很确定stackoverflow.com是用ASP.NET创建的,但无论我在哪里单击,我都会在地址栏中看到no.aspx扩展名。 它是如何完成的,有什么特别的原因吗?您可以通过ISAPI重写(针对IIS)来完成这一点和更多。它允许您创建友好的URL,而不需要所有难看的查询字符串。它为用户提供了更友好的界面,可以让您的内容更易于搜索 如果您使用的是Apache,请使用mod_rewrite 这两种方法的基本前提是,它们都采用一个友好的url(就像您在本网站中看到的url),然后使用一系列规则(通

我很确定stackoverflow.com是用ASP.NET创建的,但无论我在哪里单击,我都会在地址栏中看到no.aspx扩展名。
它是如何完成的,有什么特别的原因吗?

您可以通过ISAPI重写(针对IIS)来完成这一点和更多。它允许您创建友好的URL,而不需要所有难看的查询字符串。它为用户提供了更友好的界面,可以让您的内容更易于搜索

如果您使用的是Apache,请使用mod_rewrite

这两种方法的基本前提是,它们都采用一个友好的url(就像您在本网站中看到的url),然后使用一系列规则(通常是您指定的正则表达式)将其转换为代码易于理解的内部url或查询字符串


例如,他们使用转换规则将
posts/edit/
转换为
editPost.aspx?postNumber=

此站点使用ASP.NET MVC框架和URL映射到路由而不是物理页面。路由将传递给控制器,然后由控制器决定如何显示页面。

很可能是通过URL重写完成的

Web服务器正在获取与浏览器地址栏中的URL类似的URL,并在后台将它们重新发布到ASPX页面

这可以在.NET HTTP模块中完成,也可以作为IIS中的ISAPI处理程序完成

Scott Gutherie在他的网站上有一篇关于URL重写的好文章


在stackoverflow的情况下,他们使用ASP.NET MVC而不是ASP.NET web表单。对于web表单,url指向磁盘上的文件,而MVC指向控制器操作。如果您使用的是webforms,则需要使用URL重写。Scott Guthrie对URL重写有自己的见解。

正如其他人回答的那样,StackOverflow是使用ASP.NET MVC构建的,而ASP.NET MVC使用System.Web.Routing。但是System.Web.Routing不是ASP.NET MVC的一部分,它是带有SP1的RTMd,这意味着在没有ASP.NET MVC的情况下可以使用它。您可以在这里看到如何将其与WebForms结合使用:这里:

,原因如下:

  • 您可以在不破坏索引或书签URL的情况下更改技术(比如PHP)
  • 您的URL更加“REST”,与资源相对应,而不仅仅是一个文件
  • 您可以更轻松地记住URL或通过电话向他人阅读

您可以通过修改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>

只要.aspx、.ashx页面位于应用程序文件夹中,下面的代码就可以正常工作。优先顺序是先解析.aspx页,然后解析.ashx页

例如,如果您尝试localhost/AppFolder/Time,它将尝试解析localhost/AppFolder/Time.aspx,如果找不到,则解析localhost/AppFolder/Time.ashx

附言

  • 我没有完全测试这段代码,所以要小心

  • <> LI>

    它不考虑可能有.ASPX文件的文件夹,因此,如果您尝试访问/PosialApdioPract/MySqk/Page,它将无法解析为/PosialAppultPix/MySqk/Page .ASPX.

    。 代码:

    您可以在c#.NET中执行此操作,以便在ASP.NET中的URL中使用自定义扩展名

    让代码中的“.recon”作为您的自定义扩展名。(即将“.recon”替换为您自己的分机)


    在ASP.NET中重写URL可以实现“干净”URL,这是正确的。然而,在这种特殊情况下(stackoverflow.com),URL是由ASP.NET MVC框架的特性完成的。。。。在本例中,这个所谓的“ASP.NET MVC的本质”是System.Web.Routing。但是为什么要隐藏aspx扩展呢?这是一个实现细节,没有特别的理由向公共接口公开;URL更漂亮,更容易通过电话网读取而传输,没有它,或“cgi”,或“.php”,或…因此页面独立于语言。为什么会有这么多的否决票?问题是为什么要这样做?!当查询字符串为空时,您的解决方案不起作用passed@Thameem您可以在regex的帮助下解决它。
    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);
                    }
                }
            }
        }
    }
    
     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");
        }
     }