IIS URL Rewrite and Web.config

61

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

我不懂得IIS,但是我正在尝试解决将所有访问者重定向到example.com/page转到example.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>

会遇到几个问题:

  1. 我甚至不知道把文件放在哪里。有一个User根目录和一个htdocs目录,我都试过了,但没有成功。
  2. 我甚至不确定这个账户是否可以进行重写,我正在尝试弄清楚这一点。

1
总是,虽然现在我不能用它...但为了未来,或者可能帮助别人 :) - J. Martin
3个回答

127

1) 你现有的web.config文件:你已经声明了重写映射,但没有创建任何将使用它的规则。仅仅使用RewriteMap是无效的。

2) 下面是您可以执行的操作(它不使用重写映射——只使用规则,这对于小量的重写/重定向是可以的):

此规则将执行单个确切的重写(内部重定向),将/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扩展名的文件(即对于/page,它将检查是否存在/page.html),则规则#3将尝试对任何URL执行此重写:

<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>

3
试图理解这些地图,你的回答帮了很多。谢谢。我的赞成。 - AYK
2
@CodeSherpa 我相信Tomek已经给出了正确的解决方案:只需修改您的代码:添加<conditions><add input="{HTTPS}" pattern="off" /></conditions>,并可能使用^register\.aspx$(注意\字符--这将确保只有register.aspx将被重定向,而不是register2aspx等)。另外,请确保安装了URL Rewrite Module(它是单独下载的=不与IIS默认捆绑)。 - LazyOne
1
@LazyOne,你能帮我解决一下这个问题吗?https://dev59.com/h3jZa4cB1Zd3GeqPkv5d - SHEKHAR SHETE
@SHEKHARSHETE 这是不同的:这里是URL重写模块,而你的是实际的.NET配置(据我所知,它的工作方式有些不同,并且有一些细微差别,我不熟悉)。 - LazyOne
如果出于某种原因,你像我一样需要使用一个“非”条件,只需使用属性negate="true" :) - undefined
显示剩余2条评论

18

我只是想指出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 Rewrite模块的更多信息,请参阅此优秀文档:URL Rewrite模块配置参考

针对评论中@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)=(\d{2})" />
        </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"的匹配URL,它会是什么样子呢? - kneidels
1
@kneidels:我刚刚更新了答案,看看是否有帮助。 - Hjalti
+1 如果提供 iis.net 文档的链接(我看到现在重定向到 https://learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference )。 - fortboise
我设法让它工作了,但出于某种原因,只有在有目录即/pages的情况下才能工作 - 为什么需要这个目录?我能否在不需要存在该目录的情况下引用它? - user7201898

12

我刚刚尝试了这个规则,并且它适用于GoDaddy托管,因为他们已经为每个IIS 7帐户安装了Microsoft URL Rewriting模块。

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

3
谢谢您提到已安装该模块,我意识到自己还没有安装它,成功解决了我的问题 :) - lappy

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