2

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

如果我访问,现在可以使用

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

或者

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

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

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

这打破了(正如我所料),但这似乎是糟糕的用户体验。也许作为一个经常上网的用户,我觉得没有斜线或斜线应该可以。我知道在最后有一个斜线的唯一方法是创建一个文件夹并使用默认default.aspx页面,如果可以的话,我想避免。

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

这表明默认情况下,不带扩展名的 URL 会尝试访问目录,并且只有在未找到时 IIS 才会覆盖提供文件,因此从某种意义上说,尝试使用无扩展名的文件名来欺骗它似乎是一种黑客行为。

幸运的是,我可以完全控制文件和文件夹名称,所以我希望可以防止那里发生任何事故(尽管我必须小心)。所以我的问题是:有没有一种方法可以删除文件扩展名但仍然允许附加斜杠并仍然找到文件。如果可以的话,我不想在里面创建大量带有 default.aspx 的目录。

4

3 回答 3

1

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

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

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

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

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

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

所以上面的例子会直接

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

使用 GET 变量 article_slug 到 news.php

让我知道这是否有任何帮助,或者我是否可以提供进一步的帮助。

于 2012-05-04T08:30:42.933 回答
1

最简单的方法是使用 ASP.NET 路由,我假设您正在谈论 Web 表单,对于您的示例来说这很简单:

  1. 将 System.Web.Routing 引用添加到项目中
  2. 在 Global.asax.cs 中使用路由(使用 System.Web.Routing;)
  3. 在应用程序开始添加路由:
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

于 2012-05-04T08:33:11.377 回答
0

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

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

解决方案实际上取决于您匹配的位置和方式。

于 2012-05-04T08:54:49.263 回答