删除URL文件扩展名

时间:2012-05-03 09:55:31

标签: asp.net url url-rewriting

我一直在探索“更漂亮”的网址,其中我做的第一件事就是删除扩展名(例如.aspx)。为此,我在IIS中使用了URL Rewrite模块。

如果我访问

,现在就可以了
http://www.mysite.com/folder/filename

http://www.mysite.com/folder/filename.aspx

后者被重定向到第一个并加载页面。然后我尝试了以下内容:

http://www.mysite.com/folder/filename/

打破了(正如我预期的那样),但这似乎是糟糕的用户体验。也许作为一个频繁的网络用户,我觉得没有斜线或斜线应该工作。我知道在结尾处使用斜杠的唯一方法是创建一个文件夹并使用默认的default.aspx页面,如果可以,我想避免使用它。

继续,我尝试添加一个与文件同名的目录,因此在上面的例子中我创建了一个名为filename的目录。在此目录中,我创建了一个默认的default.aspx。现在,如果我尝试访问相同的网址http://www.mysite.com/folder/filename,我会被发送到该新文件夹的default.aspx页面,并在网址http://www.mysite.com/folder/filename/附加一个斜杠。

这表明默认情况下,没有扩展名的URL会尝试访问目录,只有在没有找到的情况下,IIS覆盖才会提供文件,因此从某种意义上来说,尝试用无扩展名文件名来欺骗它似乎是一种破解。 / p>

我很幸运能够完全控制文件和文件夹名称,所以我希望能够防止那里发生任何意外(尽管我必须小心)。所以我的问题是:有没有办法删除文件扩展名但仍然允许附加一个尾部斜杠并仍然找到该文件。我不想在内部使用default.aspx创建大量目录,如果我可以帮助的话。

3 个答案:

答案 0 :(得分:1)

我不完全确定IIS如何处理mod_rewrite,但希望我在linux环境中应用的逻辑可以帮助您解决问题。

在我的.htaccess文件中,我首先编写两个适用于以下规则的条件;它表示如果以下网址不是文件且不是目录,则将用户重定向到下一页。

但是,如果存在始终优先的目录或文件。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^news/([^/]*)$ news.php?article_slug=$1 [L,QSA]

规则允许您需要的结构(文件夹/文件)或至少将其模拟为网址。

所以上面的例子将指向

http://www.mysite.com/news/article-name &安培; http://www.mysite.com/news/article-name/

使用GET变量article_slug

添加到news.php

如果有任何帮助,或者我可以提供进一步的帮助,请告诉我。

答案 1 :(得分:1)

最简单的方法是使用ASP.NET路由,我假设您正在讨论Web表单,对于您的示例,它非常简单:

  1. 将System.Web.Routing引用添加到项目
  2. 在Global.asax.cs中使用路由(使用System.Web.Routing;)
  3. 在应用程序开始时添加路由:
  4. protected void Application_Start(object sender, EventArgs e)
    {
      RouteTable.Routes.MapPageRoute("", "Filename", "~/Filename.aspx");
    }
    

    就是这样。

    以下是有关赢取表单路由的更多信息:

    http://msdn.microsoft.com/en-us/library/cc668201.aspx#adding_routes_to_a_web_forms_application

    http://msdn.microsoft.com/en-us/library/dd329551.aspx

答案 2 :(得分:0)

IIS重写(正确)将URL与尾部斜杠匹配,而不使用尾部斜杠作为不同的URL。根据规则的实施方式,您可能需要

  • 实现2个规则,一个用于处理从所有或特定URL中添加(或删除)尾部斜杠,另一个用于处理 将URL重写为.aspx页面。
  • 您可能需要为URL添加和不添加单独的地图 尾随斜杠

解决方案实际上取决于你匹配的地点和方式。