IIS URL 重写和 Web.config

Posted

技术标签:

【中文标题】IIS URL 重写和 Web.config【英文标题】:IIS URL Rewrite and Web.config 【发布时间】:2011-05-23 13:02:30 【问题描述】:

我对 IIS 一无所知,但我正在尝试解决将所有访问者重定向到 domain.com/page 到 domain.com/page.html 的问题

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <rewrite>
          <rewriteMaps>
              <rewriteMap name="StaticRedirects">
                  <add key="/page" value="/page.html" />
              </rewriteMap>
            </rewriteMaps>
      </rewrite>
  </system.webServer>
</configuration>

出现了几个问题:

    我什至不知道将文件放在哪里。有一个用户根目录,一个htdocs目录,我都试过了,不开心。 我什至不知道该帐户是否可以进行重写,我正在尝试找出答案。

【问题讨论】:

总是,虽然我现在不能使用它......但是为了将来,或者也许是为了帮助别人:) 【参考方案1】:

1) 您现有的 web.config:您已声明 rewrite map .. 但尚未创建任何使用它的规则。 RewriteMap 本身完全没有任何作用。

2) 以下是您的操作方法(它不使用重写映射 - 仅规则,适用于少量重写/重定向):

此规则将执行 SINGLE EXACT 重写(内部重定向)/page/page.html。浏览器中的 URL 将保持不变。

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRewrite" stopProcessing="true">
                <match url="^page$" />
                <action type="Rewrite" url="/page.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

此规则 #2 将执行与上述相同的操作,但将执行 301 重定向(永久重定向),其中 URL 将在浏览器中更改。

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRedirect" stopProcessing="true">
                <match url="^page$" />
                <action type="Redirect" url="/page.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

如果存在带有 .html 扩展名的此类文件,规则 #3 将尝试对任何 URL 执行此类重写(即,对于 /page,它将检查 /page.html 是否存在,如果存在则进行重写):

<system.webServer>
    <rewrite>
        <rules>
            <rule name="DynamicRewrite" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="REQUEST_FILENAME\.html" matchType="IsFile" />
                </conditions>
                <action type="Rewrite" url="/R:1.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

【讨论】:

试图了解这些地图,您的回答帮助很大。谢谢。我的 +1 @CodeSherpa 我相信 Tomek 给出了正确的解决方案:只需更改您的解决方案:添加 &lt;conditions&gt;&lt;add input="HTTPS" pattern="off" /&gt;&lt;/conditions&gt; 并可能使用 ^register\.aspx$ (注意 \ 字符 - 这将确保只有 register.aspx重定向,而不是register2aspx 等)。另外——确保安装了 URL Rewrite Module(它是单独下载的 = 默认情况下不与 IIS 捆绑)。 @LazyOne 你能帮我看看***.com/questions/19904849/… @SHEKHARSHETE 这是不同的:这里是 URL 重写模块,而你的是实际的 .NET 配置(它的工作方式有点不同,AFAIK,并且有细微差别,我不熟悉)。 你有上面的完整示例,我应该试试吗?我是 url 重写模块的新手,所以......!【参考方案2】:

只是想指出 LazyOne 的答案中缺少的一件事(我会在答案下发表评论,但没有足够的代表)

在永久重定向的规则 #2 中缺少一些东西:

redirectType="Permanent"

所以规则 #2 应该如下所示:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRedirect" stopProcessing="true">
                <match url="^page$" />
                <action type="Redirect" url="/page.html" redirectType="Permanent" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

编辑

有关如何使用 URL 重写模块的更多信息,请参阅此出色的文档:URL Rewrite Module Configuration Reference

回应 cmets 的@kneidels 问题;要匹配 url:topic.php?id=39 可以使用类似以下内容:

<system.webServer>
  <rewrite>
    <rules>
      <rule name="SpecificRedirect" stopProcessing="true">
        <match url="^topic.php$" />
        <conditions logicalGrouping="MatchAll">
          <add input="QUERY_STRING" pattern="(?:id)=(\d2)" />
        </conditions>
        <action type="Redirect" url="/newpage/C:1" appendQueryString="false" redirectType="Permanent" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

这将匹配topic.php?id=ab,其中a0-9 之间的任意数字,b 也是0-9 之间的任意数字。 然后它将重定向到/newpage/xy,其中xy 来自原始网址。 我没有对此进行测试,但它应该可以工作。

【讨论】:

嘿。此解决方案适用于统计文件。如果匹配 url 为:match url="topic.php?id=39" 会怎样? @kneidels:我刚刚更新了答案,看看是否有帮助 +1 用于提供 iis.net 文档的链接(我看到现在重定向到 docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/…)【参考方案3】:

刚刚尝试了这条规则,它适用于 GoDaddy 主机,因为他们已经为每个 IIS 7 帐户安装了 Microsoft URL 重写模块。

<rewrite>
  <rules>
    <rule name="enquiry" stopProcessing="true">
      <match url="^enquiry$" />
      <action type="Rewrite" url="/Enquiry.aspx" />
    </rule>
  </rules>
</rewrite>

【讨论】:

感谢您提到正在安装的模块,我意识到我没有安装它并设法克服了我的问题:)

以上是关于IIS URL 重写和 Web.config的主要内容,如果未能解决你的问题,请参考以下文章

IIS URL重写

IIS5.1设置URL重写?

关于IIS7 URL重写的问题

IIS 重写 url

thinkphp在iis下如何写规则url重写

CORS 使用带有 ARR 和 URL 重写的 IIS 作为反向代理