去除HTML或ASPX扩展名

41
在托管的IIS7环境中,我正在寻找使用无扩展名文件名的最简单方法。我只有几个页面,没有动态代码,也没有特别之处。我发现的所有示例或在其他网站上开发的方法都围绕着动态内容、页面等展开。我只是想要一个最简单的解决方案,最好不需要安装任何URL重写模块。最好能保留.html扩展名,而不需要将站点转换为ASP.NET项目,但这是一种选择。具体地,我有以下页面:
- index.html (或 .aspx) --> example.com - gallery.html --> example.com/gallery - videos.html --> example.com/videos - 等等...

请访问此链接https://dev59.com/sHI95IYBdhLWcg3wvwsQ - Mohamed Kamal
参考这个答案它可以很好地工作:移除所有页面的 .aspx 扩展名 - cwishva
7个回答

57

我最终使用了以下网站:

http://blogs.msdn.com/b/carlosag/archive/2008/09/02/iis7urlrewriteseo.aspx

并且

http://forums.iis.net/t/1162450.aspx

或者基本上在我的web.config文件中使用IIS7 URL Rewrite模块的以下代码,大多数托管站点现在都提供(在这种情况下,我正在使用GoDaddy):

<system.webServer>
    <rewrite>
        <rules>
            <rule name="RewriteASPX">
                <match url="(.*)" />
                <conditions logicalGrouping="MatchAll">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="{R:1}.aspx" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

13
谢谢您提供这个优秀的解决方案。只是想澄清一下,上述的XML应该放在web.config文件的<system.webServer>元素内。 - Tim MB
这会导致与自定义错误的冲突。 - Fantasterei

14

另一种更现代的方法是使用 Microsoft.AspNet.FriendlyUrls。在 Global.asax.cs 中添加以下内容:

void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    RouteConfig.RegisterRoutes(RouteTable.Routes);

并且在RouteConfig文件中

public static class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        var settings = new FriendlyUrlSettings();
        settings.AutoRedirectMode = RedirectMode.Permanent;
        routes.EnableFriendlyUrls(settings);
    }

1
最好的一个,现在官方支持。当您创建新的WebForms项目时,此代码将自动添加。 - Shaiju T

7
另一个实现相同效果的最简单解决方案为:
将以下代码放入您的global.ascx文件中:
void Application_BeginRequest(object sender, EventArgs e)
{
   String fullOrigionalpath = Request.Url.ToString();
   String[] sElements = fullOrigionalpath.Split('/');
   String[] sFilePath = sElements[sElements.Length - 1].Split('.');

   if (!fullOrigionalpath.Contains(".aspx") && sFilePath.Length == 1)
   {
       if (!string.IsNullOrEmpty(sFilePath[0].Trim()))
           Context.RewritePath(sFilePath[0] + ".aspx");
   }
}

Pawan,我已经添加了你的代码,但仍然在URL中看到带有扩展名的页面名称。 - Nikhil D
应该可以工作,我在我的几个项目中都使用了这个。请再检查一下是否还有其他遗漏。 - Pawan Maheshwari
3
该代码使页面在没有 ".aspx" 的情况下工作,但它不会删除 ".aspx"。 - Augis
那么,如何删除 .aspx 扩展名呢?正如 Augis 所指出的那样,它可以在没有 .aspx 扩展名的情况下工作,但并没有将其删除。我应该怎么做才能实现相同的效果呢? - Jaya

1

如果您有动态代码,我认为最简单的方法就是将文件从.aspx重命名为.html,特别是如果您只有少量页面。没有简单的方法可以在不重写URL的情况下完成。

但是,在IIS 7中,您可以使用HTTP模块轻松设置它。Scott Guthrie非常好地解释了这一点。在这篇文章中,他展示了几种自定义URL的方法。我认为您会最喜欢第三种方法。

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


谢谢,但是想法是完全摆脱扩展名。不是将它们从HTML重命名为ASPX或反之亦然。ScottGu的帖子有些过时,但确实有一些有用的信息,但比我要找的更复杂。 - roadsunknown
如果你看第三种方法,该链接提供的信息确实告诉你如何删除扩展名。尽管它是在2007年撰写的,但那里的说明描述了使用IIS7删除扩展名的当前过程。 - dontangg

0

在ASP.NET中,您可以使用C#来使用自定义扩展名。

让代码中的“.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");
        }
 }

0

我没有足够的积分来评论,这是在改进Pawan M的答案。他的代码可以工作,除非页面上使用了查询字符串。我修改了Pawan的代码以允许查询字符串,而且我的是vb版本。

检查确保您的项目中有一个Global.asax.vb文件。如果没有,请通过以下方式添加一个项目:

文件 -> 新建 -> 文件 -> 全局应用程序类

在您的项目的Global.asax文件中添加此函数:

Sub Application_BeginRequest(sender As Object, e As EventArgs)
    Dim fullOrigionalpath As [String] = Request.Url.ToString()
    Dim sElements As [String]() = fullOrigionalpath.Split("/"c)
    Dim sFilePath As [String]() = sElements(sElements.Length - 1).Split("."c)
    Dim queryString As [String]() = sElements(sElements.Length - 1).Split("?"c)

    If Not fullOrigionalpath.Contains(".aspx") AndAlso sFilePath.Length = 1 Then
        If Not String.IsNullOrEmpty(sFilePath(0).Trim()) Then
            If queryString.Length = 1 Then
                Context.RewritePath(sFilePath(0) + ".aspx")
            Else
                Context.RewritePath(queryString(0) + ".aspx?" + queryString(1))
            End If

        End If
    End If
End Sub

感谢Artjom B.,现在的答案反映了您的建议。- 谢谢 - sec0ndHand

-1

ASP WebForm中针对特定页面删除.aspx扩展名的简单解决方案:

检查“Solution Explorer”>>转到Global.asax文件>>检查方法Application_BeginRequest,在此方法内编写以下代码。

// Remove aspx Extension From Smy Page
string CurrentPath = Request.Path; // getting Current Url
if(CurrentPath == "/YourPageURL")
    HttpContext MyContext = HttpContext.Current;
    MyContext.RewritePath("/YourPageURL.aspx");

这甚至无法编译。 - Tanveer Badar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接