IIS URL重写和Web.config

J. *_*tin 55 asp.net iis web-config url-rewriting

我对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>
Run Code Online (Sandbox Code Playgroud)

出现了几个问题:

  1. 我不知道哪里放文件.有一个用户根目录和一个htdocs目录,我试过两个,没有快乐.
  2. 我甚至不知道帐户是否可以重写,我试图找到它.

Laz*_*One 114

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>
Run Code Online (Sandbox Code Playgroud)

此规则#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>
Run Code Online (Sandbox Code Playgroud)

如果存在扩展名为.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>
Run Code Online (Sandbox Code Playgroud)

  • 试图了解这些地图,你的答案有很多帮助.谢谢.我的+1 (2认同)
  • @CodeSherpa我相信Tomek给出了正确的解决方案:只需改变你的:添加`<conditions> <add input ="{HTTPS}"pattern ="off"/> </ conditions>`并且可能使用`^ register\.aspx $`(注意\字符 - 这将确保只重定向`register.aspx`,而不是'register2aspx`等).另外 - 确保安装了**URL Rewrite Module**(它是单独的下载=默认情况下不与IIS捆绑). (2认同)

Hja*_*lti 14

只想指出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>
Run Code Online (Sandbox Code Playgroud)

编辑

有关如何使用URL重写模块的更多信息,请参阅此优秀文档:URL重写模块配置参考

回应评论中的@kneidels问题; 要匹配网址: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>
Run Code Online (Sandbox Code Playgroud)

这将与topic.php?id=ab地方a之间的任何数量0-9和b也是之间的任意数字0-9.然后,它会重定向到/newpage/xy那里xy来自于原来的URL.我没有测试过这个,但它应该可行.


nol*_*mit 11

刚试过这个规则,它与GoDaddy托管一起工作,因为他们已经为每个IIS 7帐户安装了Microsoft URL重写模块.

<rewrite>
  <rules>
    <rule name="enquiry" stopProcessing="true">
      <match url="^enquiry$" />
      <action type="Rewrite" url="/Enquiry.aspx" />
    </rule>
  </rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)

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