Asp.net 如何在IIS重写模块中为我的站点创建自定义规则

Asp.net 如何在IIS重写模块中为我的站点创建自定义规则,asp.net,iis,web-config,Asp.net,Iis,Web Config,我在试图使用根路径中的Web.Config文件为IIS 8.0上的重定向应用程序路径编写2条规则时遇到问题 1) 我需要将这些URL的“www.misite.com”和“missite.com”重定向到“~/main”文件夹。 2) 我需要将URL“subdomain.misite.com”重定向到“~/subdomain”文件夹 对于我正在使用的第一个: <rule name="Redirect to Main" stopProcessing="true"> &

我在试图使用根路径中的Web.Config文件为IIS 8.0上的重定向应用程序路径编写2条规则时遇到问题

1) 我需要将这些URL的“www.misite.com”和“missite.com”重定向到“~/main”文件夹。 2) 我需要将URL“subdomain.misite.com”重定向到“~/subdomain”文件夹

对于我正在使用的第一个:

    <rule name="Redirect to Main" stopProcessing="true">
      <match url="(.*)" />
      <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^www.misite.com(/.*)?$" />
        <add input="{REQUEST_URI}" negate="true" pattern="/main" />
      </conditions>
      <action type="Redirect" url="http://www.misite.com/main/{R:1}" />
    </rule>

    <rule name="Redirect to Main" stopProcessing="true">
      <match url="(.*)" />
      <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^misite.com(/.*)?$" />
        <add input="{REQUEST_URI}" negate="true" pattern="/main" />
      </conditions>
      <action type="Redirect" url="http://www.misite.com/main/{R:1}" />
    </rule>

对于第二个:

    <rule name="Redirect to Subdomain" stopProcessing="true">
      <match url="(.*)" />
      <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^subdomain.misite.com(/.*)?$" />
        <add input="{REQUEST_URI}" negate="true" pattern="/subdomain" />
      </conditions>
      <action type="Redirect" url="http://www.misite.com/subdomain/{R:1}" />
    </rule>

第一条规则行得通,但第二条规则是当我尝试浏览“subdomain.misite.com”时,我被重定向到http://www.misite.com/main/subdomain“


我将感谢您的帮助。

我认为您在这里混淆了重定向和重写-您描述的行为正是根据引用的规则我所期望的。最初,请求被重定向到www.misite.com/subdomain,然后根据您的第一条规则,请求再次被重定向到www.misite.com/main/subdomain。我认为您想在这里做的是重写请求,为每个子域提供正确的内容

重定向实际上意味着“如果URL‘a’的请求到达,请将浏览器转发到URL‘B’”。重写请求实际上意味着“如果接收到对URL‘a’的请求,那么就如同在URL‘a’上一样为资源‘B’提供服务”

我假设你有以下结构-

-wwwroot

--主要

--子域

大概您希望发生的是,当用户访问www.domain.com/default.aspx时,“main”目录中的default.aspx文档将被提供,同样,当用户访问subdomain.domain.com时,“subdomain”目录中的default.aspx文档将被返回

我还假设您不希望文件夹本身成为路径的一部分,即不是subdomain.domain.com/subdomain/default.aspx

<rule name="Rewrite to Main directory" stopProcessing="true">
  <match url="(.*)" />
  <conditions logicalGrouping="MatchAll">
    <add input="{HTTP_HOST}" pattern="^www.misite.com(/.*)?$" />
    <add input="{PATH_INFO}" negate="true" pattern="/main/" />
  </conditions>
  <action type="Rewrite" url="/main/{R:1}" />
</rule>

<rule name="Redirect to WWW" stopProcessing="true">
  <match url="(.*)" />
  <conditions logicalGrouping="MatchAll">
    <add input="{HTTP_HOST}" pattern="^misite.com(/.*)?$" />
  </conditions>
  <action type="Redirect" url="http://www.misite.com/{R:0}" redirectType="Permanent" />
</rule>

)并且会给你带来分析方面的问题。在这种情况下,我选择将domain.com/default.aspx重定向到www.domain.com/default.aspx,但选择另一种方式也同样有效-您只需要做出选择并在您的站点中一致地应用它

我已经删除了重定向路径/URL的/main/部分,因为/main/目录中的内容无论如何都是请求应该提供的内容,将其保留在路径中实际上是在寻找/main/main/default.aspx。我还在第一条(重写)规则中的path info条件中添加了一个否定,这意味着如果确实有针对www.domain.com/main/default.aspx的请求到达,它将不会被重写以提供子目录中的内容-/main/default.aspx将被提供,而不是/main/main/default.aspx中的(可能不存在)文件

最后,子域也更改为重写

<rule name="Rewrite for Subdomain" stopProcessing="true">
  <match url="(.*)" />
  <conditions logicalGrouping="MatchAll">
    <add input="{HTTP_HOST}" pattern="^subdomain.misite.com(/.*)?$" />
    <add input="{PATH_INFO}" negate="true" pattern="/subdomain/" />
  </conditions>
  <action type="Rewrite" url="/subdomain/{R:1}" />
</rule>

有关此主题的详细信息